8锁现象
什么是锁?锁的到底是什么?
package com.fang.lock8; import java.sql.Time; import java.util.concurrent.TimeUnit; /** * 8锁,就是关于锁的8个问题 * 1.标准情况下是先发短信还是打电话 * 2.发短信方法延迟4秒 */ public class Test1 { public static void main(String[] args) { Phone phone = new Phone(); new Thread(()->{ phone.sendSms(); },"A").start(); try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } new Thread(()->{ phone.call(); },"B").start(); } } class Phone{ //synchronized锁的对象是方法的调用者 //两个方法用的是同一个锁,谁先拿到谁先执行 public synchronized void sendSms() { try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("sendSms"); } public synchronized void call() { System.out.println("call"); } }
package com.fang.lock8; import java.sql.Time; import java.util.concurrent.TimeUnit; /** * 3.增加一个普通方法,是先执行发短信还是hello(1秒钟输出hello,4秒后输出发短信) * 4.两个对象,两个同步方法,先打电话,再发短信(两个不同的对象,两把锁) */ public class Test2 { public static void main(String[] args) { Phone2 phone = new Phone2(); Phone2 phone2 = new Phone2(); new Thread(()->{ phone.sendSms(); },"A").start(); try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } new Thread(()->{ phone2.call(); },"B").start(); } } class Phone2{ //synchronized锁的对象是方法的调用者 public synchronized void sendSms() { try { TimeUnit.SECONDS.sleep(4); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("sendSms"); } public synchronized void call() { System.out.println("call"); } //这里没有锁,不是同步方法,不受锁的影响 public void hello() { System.out.println("hello"); } }
package com.fang.lock8; import java.sql.Time; import java.util.concurrent.TimeUnit; /** * 5.增加两个静态同步方法,只有一个对象(先发短信,再打电话) * 6.两个对象,增加两个静态同步方法(先发短信,再打电话) */ public class Test3 { public static void main(String[] args) { //两个对象的class模板只有一个,static,锁的是class Phone3 phone = new Phone3(); Phone3 phone2 = new Phone3(); new Thread(()->{ phone.sendSms(); },"A").start(); try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } new Thread(()->{ phone2.call(); },"B").start(); } } class Phone3{ //synchronized锁的对象是方法的调用者 //static 静态方法 类一加载就有了!class模板,锁的是class对象Class<Phone3> phone3Class = Phone3.class; //两个方法用的是同一个锁 public static synchronized void sendSms() { try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("sendSms"); } public static synchronized void call() { System.out.println("call"); } }
package com.fang.lock8; import java.sql.Time; import java.util.concurrent.TimeUnit; /** * 7.一个静态同步方法,一个普通的同步方法,一个对象(先打电话) * 8.两个对象(先打电话) */ public class Test4 { public static void main(String[] args) { //两个对象的class模板只有一个,static,锁的是class Phone4 phone = new Phone4(); Phone4 phone2 = new Phone4(); new Thread(()->{ phone.sendSms(); },"A").start(); try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } new Thread(()->{ phone2.call(); },"B").start(); } } class Phone4{ //锁的是class类模板 //static 静态方法 类一加载就有了!class模板,锁的是class对象Class<Phone3> phone3Class = Phone3.class; //两个方法用的是两个锁 public static synchronized void sendSms() { try { TimeUnit.SECONDS.sleep(4); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("sendSms"); } //普通的同步方法,锁的是调用者 public synchronized void call() { System.out.println("call"); } }

浙公网安备 33010602011771号