------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
因为这是学习笔记,我就不归纳总结了,想到哪就说到哪了
synchronized同步一段代码块后,他是单条件的,这里我想做个比喻
比如很多人在做一个满汉全席,有做满菜的人,有做汉菜的人,有搅拌的人,有上菜的人
这里的每一个人可以比作一个线程,当一切准备好后,做满菜的人开始执行,其他的三个人都在睡眠,过了会,满菜已经做好,该线程准备睡眠,在此之前,他必须唤醒一个人,这里就是关键,signal是随机唤醒一个人,signal是全部唤醒,这里都不合适,那么condition就必须上场,加入满汉全席的这个实例对象是他们四个人共用的一把锁,他可以创建4个condition实例对象,那么此时做满菜的人可以有选择的唤醒搅拌的人,此时该线程开始执行,接着,他在睡眠之前唤醒做汉菜的人,然后他唤醒上菜的人.....
我想举几个例子来整理一下自己的思维
同样一个Resource
private Lock lock=new ReentrantLock();
private Condition pro_con=lock.newCondition();
private Condition con_con=lock.newCondition();
切记,他们必须是操作的同样的资源,在这样一种情况下再派生出不同的condition
下面的例子是生产者和消费者互相唤醒
此时的等待表示的是某一个condition在等待,唤醒也很明确的表示了是唤醒哪一个在等待的condition
静态方法和实例方法的锁是不同的
* 当同步函数被静态修饰符修饰时,用的锁不再是this,而是这个类
* 静态进内存时,没有本类对象,但是有类名.class这个文件
* 静态的同步方法使用的锁是 该方法所在类的类名.class