黑马程序员技术交流社区

标题: 在同步中如何避免死锁问题? [打印本页]

作者: 素人    时间: 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);
  1. 为了解决死锁的,需用同步
  2. public class SyncDemo {
  3.   Object monitor = new Object();
  4.   int i=1;
  5.   //public synchronized int getNumber(){
  6.   public int getNumber(){
  7.     synchronized (monitor) {// 可以使用this
  8.       if(i==20){
  9.         throw new RuntimeException("Over");
  10.       }
  11.       try {
  12.         Thread.sleep(10);
  13.       } catch (InterruptedException e) {
  14.       }
  15.       return i++;
  16.     }
  17.   }
  18.   class MyThread extends Thread{
  19.     public void run() {
  20.       while(true){
  21.         System.out.println(getNumber());
  22.       }
  23.     }
  24.   }
  25.   
  26.   public void go(){
  27.     Thread t1 = new MyThread();
  28.     Thread t2 = new MyThread();
  29.     t1.start();
  30.     t2.start();
  31.   }
  32.   
  33.   public static void main(String[] args) {
  34.     new SyncDemo().go();
  35.   }
  36.   
  37.   
  38. }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2