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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© JarryHorse 中级黑马   /  2015-4-26 22:05  /  727 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Lock类可以实现锁的功能,那么问题来了,synchronized可以指定锁对象,如果说Lock本身就是锁对象的话,在线程间通讯的时候,为什么使用同一个Lock对象lock两个方法内的代码,但这两个代码是可以同时执行的。
  1. /*
  2. 需求:演示Lock类和线程间通讯
  3. */

  4. import java.util.concurrent.locks.*;

  5. //封装了主函数的类
  6. class  ThreadDemo
  7. {
  8.         //主函数
  9.         public static void main(String[] args)
  10.         {
  11.                 //创建Runnable子类对象,在构造函数中传入
  12.                 Data data = new Data();

  13.                 //创建两个线程对象,在构造函数传入同一个Runnable子类对象
  14.                 new Thread(new TrueData(data)).start();
  15.                 new Thread(new FalseData(data)).start();

  16.         }
  17. }
  18. //用实现Runnable接口的方法创建类
  19. class TrueData implements Runnable
  20. {

  21.         private Data data;

  22.         TrueData(Data data)
  23.         {
  24.                 this.data = data;
  25.         }
  26.        
  27.         public void run()
  28.         {
  29.                 data.on();
  30.         }
  31. }
  32. //用实现Runnable接口的方法创建类
  33. class FalseData implements Runnable
  34. {
  35.         private Data data;

  36.         FalseData(Data data)
  37.         {
  38.                 this.data = data;
  39.         }

  40.         public void run()
  41.         {
  42.                 data.off();
  43.         }
  44. }
  45. class Data
  46. {
  47.         private int num = 1;
  48.         private boolean logic = true;

  49.         //定义两个同步代码块的锁对象
  50.         private Lock lock = new ReentrantLock();
  51.         private Condition cona = lock.newCondition();
  52.         private Condition conb = lock.newCondition();



  53.         public void on()
  54.         {
  55.                 while(true)
  56.                 {
  57.                         try
  58.                         {
  59.                                 lock.lock();
  60.                                 if (logic)
  61.                                 {
  62.                                         cona.await();
  63.                                 }
  64.                                 num = 1;
  65.                                 logic = true;

  66.                                 //打印语句
  67.                                 System.out.println("Logic on..."+"num:"+num+" logic:"+logic);
  68.                                                
  69.                                 conb.signal();
  70.                         }
  71.                         catch (InterruptedException e)
  72.                         {
  73.                                 e.printStackTrace();
  74.                         }
  75.                         finally
  76.                         {
  77.                                 lock.unlock();
  78.                         }
  79.                 }
  80.         }
  81.         public void off()
  82.         {
  83.                 while(true)
  84.                 {
  85.                         try
  86.                         {
  87.                                 lock.lock();
  88.                                         if(!logic)
  89.                                                 conb.await();
  90.                                         num = 0;
  91.                                         logic=false;

  92.                                         //打印语句
  93.                                         System.out.println("Logic off......"+"num:"+num+" logic:"+logic);
  94.                                                
  95.                                         cona.signal();
  96.                                
  97.                         }
  98.                         catch (InterruptedException e)
  99.                         {
  100.                                 e.printStackTrace();
  101.                         }
  102.                         finally
  103.                         {
  104.                                 lock.unlock();
  105.                         }
  106.                 }
  107.         }
  108. }
复制代码

像这样,线程在同步中wait了,为什么另一个线程可以执行同步内的代码,难道当前线程wait的时候会释放此锁么?看API中貌似没有这样的描述,困惑,请大神解答

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马