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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

先把代码贴出来
  1. package cn.ywl.extendsdemos;

  2. import java.util.concurrent.locks.Condition;
  3. import java.util.concurrent.locks.Lock;
  4. import java.util.concurrent.locks.ReentrantLock;

  5. public class LockDemo {

  6.         public static void main(String[] args) {

  7.                 Lockc ck = new Lockc();
  8.                 producer p = new producer(ck);
  9.                 consumer c = new consumer(ck);

  10.                 Thread t1 = new Thread(p);
  11.                 Thread t2 = new Thread(p);
  12.                 Thread t3 = new Thread(c);
  13.                 Thread t4 = new Thread(c);

  14.                 t4.start();
  15.                 t2.start();
  16.                 t3.start();
  17.                 t1.start();
  18.         }

  19. }

  20. class Lockc {

  21.         private String name;
  22.         public int cuu = 1;
  23.         private boolean o = false;

  24.         Lock kk = new ReentrantLock();
  25.         Condition ll_1 = kk.newCondition();
  26.         Condition ll_2 = kk.newCondition();

  27.         public void set(String name) throws InterruptedException {
  28.                
  29.                 System.out.println(Thread.currentThread().getName()+"set run!!");
  30.                
  31.                 kk.lock();               
  32.                
  33.                 while (o)
  34.                         try {
  35.                                 System.out.println("set ..... try");
  36.                                 ll_1.await(); // t1 t2
  37.                                 this.name = name + "....." + cuu++;

  38.                                 System.out.println("生产者...................." + this.name+ "..........");
  39.                                 o = true;
  40.                                 ll_2.signal();
  41.                         } finally {
  42.                                 System.out.println("set .....finally!");
  43.                                 kk.unlock();
  44.                         }
  45.                 System.out.println("set over!!!");
  46.         }

  47.         public void out() throws InterruptedException {                        //如果操作这段代码的线程第一个抢到CPU,那么这里就会执行一次
  48.                
  49.                 System.out.println("out run!!!");                               
  50.                
  51.                 kk.lock();                                                                                                               
  52.                                                
  53.                 while (!o)
  54.                         try {
  55.                                 System.out.println(".....");
  56.                                 ll_2.await(); // t3 t4                                                        //!o = true,线程直接 wait了。
  57.                                 System.out.println("消费者" + "...........");
  58.                                 o = false;
  59.                                 ll_1.signal();
  60.                         } finally {
  61.                                 System.out.println("unlock!!!");
  62.                                 kk.unlock();                                                                        //能执行到try里面,当然也能执行到finally里面
  63.                         }
  64.                 System.out.println("set over!!!");
  65.         }
  66. }

  67. class producer implements Runnable {
  68.         private Lockc lo;

  69.         producer(Lockc lo) {
  70.                 this.lo = lo;
  71.         }

  72.         public void run() {

  73.                 while (true) {
  74.                        
  75.                         try {
  76.                                 Thread.sleep(1000);
  77.                         } catch (InterruptedException e1) {
  78.                                 e1.printStackTrace();
  79.                         }
  80.                         // if(lo.cuu>0)
  81.                         try {
  82.                                 lo.set("++商品++");
  83.                         } catch (InterruptedException e) {
  84.                                 e.printStackTrace();
  85.                         }
  86.                 }
  87.         }
  88. }

  89. class consumer implements Runnable {
  90.         private Lockc lo;

  91.         consumer(Lockc lo) {
  92.                 this.lo = lo;
  93.         }

  94.         public void run() {

  95.                 while (true) {
  96.                         try {
  97.                                 Thread.sleep(1000);
  98.                         } catch (InterruptedException e1) {
  99.                                 e1.printStackTrace();
  100.                         }
  101.                         try {
  102.                                 lo.out();
  103.                         } catch (InterruptedException e) {
  104.                                 e.printStackTrace();
  105.                         }
  106.                 }
  107.         }

  108. }
  109. /*
  110. 运行几秒的结果:
  111. out run!!!
  112. .....
  113. Thread-1set run!!
  114. set over!!!
  115. out run!!!
  116. Thread-0set run!!
  117. Thread-1set run!!
  118. set over!!!
  119. Thread-1set run!!
  120. set over!!!
  121. Thread-1set run!!
  122. set over!!!
  123. */
复制代码
关于lock()方法,API中有这样一句:如果锁不可用,出于线程调度目的,将禁用当前线程,并且在获得锁之前,该线程将一直处于休眠状态。

在我这段代码中,第一个拿到kk锁的是消费者线程,为什么生产者线程还可以使用kk.lock();?

难道API中说的禁用当前线程是指的前面获取kk锁的消费者线程?不应该啊。

求解释........

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1

查看全部评分

3 个回复

倒序浏览
{:soso_e150:}求解释.......
回复 使用道具 举报
帖子马上要沉了。。。自己顶起来。求解释{:soso_e149:}
回复 使用道具 举报
多线程通信的问题,当一个线程处于睡眠或wait状态时,就会放弃执行资格,同时就释放锁,那么醒着的线程就能拿到锁,并执行了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马