黑马程序员—多线程学习笔记

------、期待与您交流! -------

因为这是学习笔记,我就不归纳总结了,想到哪就说到哪了

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

经验分享 程序员 微信小程序 职场和发展