A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 素人 初级黑马   /  2013-10-23 21:36  /  1306 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在同步中如何避免死锁问题?

评分

参与人数 1黑马币 +6 收起 理由
狼王 + 6

查看全部评分

4 个回复

正序浏览
线程的同步
  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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
多个同步代码块用同一把锁可以避免死锁问题,但这可能是理想化的并不现实,所以用同步代码块的时候要注意点
回复 使用道具 举报
可以用lock避免死锁,尽量不用同步就行
回复 使用道具 举报
正确的编码,这东西和其他错误一样,避免不了。死锁产生的原因是多个线程并行使用多个锁来同步,有可能会相互冲突,而导致线程无法执行。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马