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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 a12366456 于 2015-7-27 15:21 编辑

使用Lock同步代码快的时候,开两个线程代码执行完,程序会终止。如果开启三个以上的线程,代码执行完,程序并不终止。使用synchronized没有这种现象,这是为何
  1. public class ThreadLock implements Runnable {

  2.         private Count count;
  3.         public ThreadLock(Count count) {
  4.                 this.setCount(count);
  5.         }

  6.         public ThreadLock() {
  7.                 // TODO Auto-generated constructor stub
  8.         }

  9.         @Override
  10.         public void run() {

  11.                 while (count.getI()>0) {
  12.                         count.printCount();
  13.                 }

  14.         }

  15.         /**
  16.          * @param args
  17.          */
  18.         public static void main(String[] args) {
  19.                 Count count = new Count(20);
  20.                 new Thread(new ThreadLock(count), "线程1").start();
  21.                 new Thread(new ThreadLock(count), "线程2").start();
  22.                 new Thread(new ThreadLock(count), "线程3").start();
  23.                 new Thread(new ThreadLock(count), "线程4").start();

  24.         }

  25.         public Count getCount() {
  26.                 return count;
  27.         }

  28.         public void setCount(Count count) {
  29.                 this.count = count;
  30.         }

  31. }

  32. class Count {
  33.         private int i = 0;
  34.         private Lock lock = new ReentrantLock();

  35.         public Count(int i) {
  36.                 super();
  37.                 this.i = i;
  38.         }

  39.         public void printCount() {
  40.                 lock.lock();
  41.                 //synchronized (ThreadLock.class) {
  42.                         if (i > 0) {
  43.                                 try {
  44.                                         Thread.sleep(100);
  45.                                 } catch (InterruptedException e) {
  46.                                         // TODO Auto-generated catch block
  47.                                         e.printStackTrace();
  48.                                 }
  49.                                 try {
  50.                                         System.out.println(Thread.currentThread().getName() + "  i=" + i--);
  51.                                 } finally {
  52.                                         lock.unlock();
  53.                                 }
  54.                         }
  55.         //        }
  56.                
  57.         }

  58.         public int getI() {
  59.                 return i;
  60.         }

  61.         public void setI(int i) {
  62.                 this.i = i;
  63.         }

  64. }
复制代码



6 个回复

倒序浏览
三个线程,代码执行完毕,程序不会终止吗??有这种问题吗?是不是发生别的问题了?
回复 使用道具 举报
用的是同一个锁吗?
回复 使用道具 举报
libin 发表于 2015-7-27 13:28
三个线程,代码执行完毕,程序不会终止吗??有这种问题吗?是不是发生别的问题了? ...

2个线程执行完可以自己终止,3个以上就有点像死锁一样停在那,不过执行结果是对的
回复 使用道具 举报
陈鹏No1 发表于 2015-7-27 14:01
用的是同一个锁吗?

是的,我把代码也贴出来
回复 使用道具 举报
贴出来看看。
回复 使用道具 举报

已经贴了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马