哪些网站做二手挖机,做网站小程序,网站排名影响因素,天津环保网站建设概念5. 8锁现象
如何判断锁的是谁#xff01;锁到底锁的是谁#xff1f;
锁会锁住#xff1a;对象、Class
深刻理解我们的锁
问题1
两个同步方法#xff0c;先执行发短信还是打电话
public class dome01 {public static void main(String[] args) {Phone phone new Phon…5. 8锁现象
如何判断锁的是谁锁到底锁的是谁
锁会锁住对象、Class
深刻理解我们的锁
问题1
两个同步方法先执行发短信还是打电话
public class dome01 {public static void main(String[] args) {Phone phone new Phone(); new Thread(() - { phone.sendMs(); }).start();TimeUnit.SECONDS.sleep(1);new Thread(() - { phone.call(); }).start();}
}class Phone {public synchronized void sendMs() {System.out.println(发短信);}public synchronized void call() {System.out.println(打电话);}
}输出结果为发短信打电话问题2
我们再来看我们让发短信 延迟4s
public class dome01 {public static void main(String[] args) throws InterruptedException {Phone phone new Phone();new Thread(() - {try {phone.sendMs();} catch (InterruptedException e) {e.printStackTrace();}}).start();TimeUnit.SECONDS.sleep(1);new Thread(() - { phone.call(); }).start();}
}class Phone {public synchronized void sendMs() throws InterruptedException {TimeUnit.SECONDS.sleep(4);System.out.println(发短信);}public synchronized void call() {System.out.println(打电话);}
}结果还是先发短信然后再打电话原因并不是顺序执行而是synchronized 锁住的对象是方法的调用对于两个方法用的是同一个锁谁先拿到谁先执行另外一个等待 问题三
加一个普通方法
public class dome01 {public static void main(String[] args) throws InterruptedException {Phone phone new Phone();new Thread(() - {try {phone.sendMs();} catch (InterruptedException e) {e.printStackTrace();}}).start();TimeUnit.SECONDS.sleep(1);new Thread(() - { phone.hello(); }).start();}
}class Phone {public synchronized void sendMs() throws InterruptedException {TimeUnit.SECONDS.sleep(4);System.out.println(发短信);}public synchronized void call() {System.out.println(打电话);}public void hello() {System.out.println(hello);}
}输出结果为hello发短信原因hello是一个普通方法不受synchronized锁的影响不用等待锁的释放 问题四
如果我们使用的是两个对象一个调用发短信一个调用打电话那么整个顺序是怎么样的呢
public class dome01 {public static void main(String[] args) throws InterruptedException {Phone phone1 new Phone();Phone phone2 new Phone();new Thread(() - {try {phone1.sendMs();} catch (InterruptedException e) {e.printStackTrace();}}).start();TimeUnit.SECONDS.sleep(1);new Thread(() - { phone2.call(); }).start();}
}class Phone {public synchronized void sendMs() throws InterruptedException {TimeUnit.SECONDS.sleep(4);System.out.println(发短信);}public synchronized void call() {System.out.println(打电话);}public void hello() {System.out.println(hello);}
}输出结果打电话发短信原因两个对象两把锁不会出现等待的情况发短信睡了4s,所以先执行打电话 问题五、六
如果我们把synchronized的方法加上static变成静态方法那么顺序又是怎么样的呢
1我们先来使用一个对象调用两个方法
答案是先发短信,后打电话
2如果我们使用两个对象调用两个方法
答案是还是先发短信后打电话
原因是什么呢 为什么加了static就始终前面一个对象先执行呢为什么后面会等待呢
原因是对于static静态方法来说对于整个类Class来说只有一份对于不同的对象使用的是同一份方法相当于这个方法是属于这个类的如果静态static方法使用synchronized锁定那么这个synchronized锁会锁住整个对象不管多少个对象对于静态的锁都只有一把锁谁先拿到这个锁就先执行其他的进程都需要等待
问题七
如果我们使用一个静态同步方法、一个同步方法、一个对象调用顺序是什么
public class dome01 {public static void main(String[] args) throws InterruptedException {Phone phone1 new Phone();
// Phone phone2 new Phone();new Thread(() - {try {phone1.sendMs();} catch (InterruptedException e) {e.printStackTrace();}}).start();TimeUnit.SECONDS.sleep(1);new Thread(() - { phone1.call(); }).start();}
}class Phone {public static synchronized void sendMs() throws InterruptedException {TimeUnit.SECONDS.sleep(4);System.out.println(发短信);}public synchronized void call() {System.out.println(打电话);}public void hello() {System.out.println(hello);}
}输出结果打电话发短信原因因为一个锁的是Class类的模板一个锁的是对象的调用者。所以不存在等待直接运行。 问题八
如果我们使用一个静态同步方法、一个同步方法、两个对象调用顺序是什么
public class dome01 {public static void main(String[] args) throws InterruptedException {Phone phone1 new Phone();Phone phone2 new Phone();new Thread(() - {try {phone1.sendMs();} catch (InterruptedException e) {e.printStackTrace();}}).start();TimeUnit.SECONDS.sleep(1);new Thread(() - { phone2.call(); }).start();}
}class Phone {public static synchronized void sendMs() throws InterruptedException {TimeUnit.SECONDS.sleep(4);System.out.println(发短信);}public synchronized void call() {System.out.println(打电话);}public void hello() {System.out.println(hello);}
}输出结果打电话发短信原因两把锁锁的不是同一个东西 小解
new 出来的 this 是具体的一个对象
static Class 是唯一的一个模板