黑马程序员技术交流社区
标题:
在同步中如何避免死锁问题?
[打印本页]
作者:
素人
时间:
2013-10-23 21:36
标题:
在同步中如何避免死锁问题?
在同步中如何避免死锁问题?
作者:
狼王
时间:
2013-10-23 22:30
正确的编码,这东西和其他错误一样,避免不了。死锁产生的原因是多个线程并行使用多个锁来同步,有可能会相互冲突,而导致线程无法执行。
作者:
马晓平
时间:
2013-10-23 22:35
可以用lock避免死锁,尽量不用同步就行
作者:
终结者
时间:
2013-10-23 22:55
多个同步代码块用同一把锁可以避免死锁问题,但这可能是理想化的并不现实,所以用同步代码块的时候要注意点
作者:
漫步人
时间:
2013-10-23 22:58
线程的同步
1 多个线程并发读写同一个临界资源时候会发生线程安全问题
2 可以使用 同步代码块解决 同步读写临界资源, 解决并发安全
问题.
3 a 同步代码块
synchronized(同步监视器){
}
b 同步监视器 是一个任意对象实例. 是一个多个线程之间的互
斥的锁机制. 多个线程要使用同一个"监视器" 实现同步互斥
c 常见写法:
synchronized(this){
}
d 如果方法的全部过程需要同步, 可以简单使用 synchronized
修饰方法.
Java中同步的API
1 StringBuffer 是同步的
synchronized append();
StringBuilder 不是同步的
append();
2 Vector 和 Hashtable 是同步的
ArrayList 和 HashMap 不是同步的
3 Collections.synchronizedList()
ArrayList list = new ArrayList();
List syncList = Collections.synchronizedList(list);
为了解决死锁的,需用同步
public class SyncDemo {
Object monitor = new Object();
int i=1;
//public synchronized int getNumber(){
public int getNumber(){
synchronized (monitor) {// 可以使用this
if(i==20){
throw new RuntimeException("Over");
}
try {
Thread.sleep(10);
} catch (InterruptedException e) {
}
return i++;
}
}
class MyThread extends Thread{
public void run() {
while(true){
System.out.println(getNumber());
}
}
}
public void go(){
Thread t1 = new MyThread();
Thread t2 = new MyThread();
t1.start();
t2.start();
}
public static void main(String[] args) {
new SyncDemo().go();
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2