JavaSE02_Day01(下)-互斥锁、聊天室案例重构(三、四)
一、互斥锁
1.1互斥锁
概念:如果使用synchronized关键字进行锁定多个代码片段时,并且指定的同步监视器对象是同一个监视器对象,那么当前代码进行执行的时候是有互斥效果,多个代码片段不能够同时进行执行。
问题:定义两个方法,方法A和方法B,这两个方法一个是进行人的呼吸,另一个方法是进行人的吞咽,然后对这两个方法的代码片段进行“上锁”,最终进行测试,查看执行代码以后,控制台的输出语句是否两个线程可以进行同时执行?
答案:不能同时执行的。
package cn.tedu.thread02;
/**
* 互斥锁案例演示
* @author cjn
*
*/
public class SyncDemo05 {
public static void main(String[] args) {
Person person = new Person();
Thread t1 = new Thread() {
控制台结果:两个线程没有同时执行,存在互斥。
包老师的气管:开始吸气...
包老师的气管:吸气完成...
包老师的食管:开始吃东西...
包老师的食管:吃完东西了...
1.2 互斥锁常见的面试题
问题:如果在一个类中有两个方法,一个方法是静态方法,另一个方法是非静态方法,当进行使用线程,分别把两个方法作为任务序列进行调用执行,是否存在互斥关系?(这两个方法都添加了synchronized)
答案:静态方法和非静态方法(对象方法)如果同时声明了方法中带有synchronized关键字,它们之间是不存在互斥关系的,也就是非互斥关系。原因:静态方法使用synchronized关键字锁的对象是类对象,而非静态方法(对象方法)使用synchronized关键字锁的对象是当前方法所属的对象,也就意味着锁对象并不是同一个对象,所以不存在互斥关系。
代码测试:
package cn.tedu.thread;
/**
* 互斥锁案例面试题演示
* @author cjn
*
*/
public class SyncDemo05 {
public static void main(String[] args) {
Person p = new Person();
Thread t1 = new Thread(){