JUC详解-4-八锁现象彻底理解锁
程序员文章站
2022-12-19 17:35:51
JUC详解 -> 八锁现象如何判断锁的是谁?import java.util.concurrent.TimeUnit;/** * 八锁:就是关于锁的八个问题 * 1.标准情况下,两个线程先打印发短信还是打电话? 1 发短信 -> 2 打电话 * 2.sendSms()延迟4秒,两个线程先打印发短信还是打电话? 1 发短信 -> 2 打电话 */public class Test01 { public static void main(String[] args)...
JUC详解 -> 八锁现象
如何判断锁的是谁?
import java.util.concurrent.TimeUnit;
/**
* 八锁:就是关于锁的八个问题
* 1.标准情况下,两个线程先打印发短信还是打电话? 1 发短信 -> 2 打电话
* 2.sendSms()延迟4秒,两个线程先打印发短信还是打电话? 1 发短信 -> 2 打电话
*/
public class Test01 {
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(4);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("sendSms");
}
public synchronized void call(){
System.out.println("call");
}
}
import java.util.concurrent.TimeUnit;
/**
* 八锁:就是关于锁的八个问题
* 3.增加了一个普通方法后,先执行发短信还是hello? 1 hello -> 2.sendSms
* 4.两个对象,两个同步方法,先执行发短信还是打电话? 1 call -> 2.sendSms
*/
public class Test02 {
public static void main(String[] args) {
//两个对象,两个调用者,两把锁!
Phone2 phone1 = new Phone2();
Phone2 phone2 = new Phone2();
//锁的存在
new Thread(()->{
phone1.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");
}
}
import java.util.concurrent.TimeUnit;
/**
* 八锁:就是关于锁的八个问题
* 5.增加两个静态的同步方法,只有一个对象,先执行发短信还是打电话? 1 sendSms > 2 call
* 6.两个对象!增加两个静态的同步方法,只有一个对象,先执行发短信还是打电话? 1 sendSms > 2 call
*/
public class Test03 {
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();
}
}
//Phone3唯一的class对象
class Phone3{
//synchronized 锁的对象是方法的调用者!
//static 静态方法,类一加载就有了 锁的是Class
public static synchronized void sendSms(){
try {
TimeUnit.SECONDS.sleep(4);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("sendSms");
}
public static synchronized void call(){
System.out.println("call");
}
}
import java.util.concurrent.TimeUnit;
/**
* 八锁:就是关于锁的八个问题
* 7. 1个静态同步方法、1个普通同步方法,1个对象,先执行发短信还是打电话? 1 call -> 2 sendSms
* 8. 1个静态同步方法、1个普通同步方法,2个对象,先执行发短信还是打电话? 1 call -> 2 sendSms
*/
public class Test04 {
public static void main(String[] args) {
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{
//static 静态方法,类一加载就有了
//静态同步方法 锁的是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");
}
}
小结:
new :this 具体的对象
static : Class唯一的一个模板
本文地址:https://blog.csdn.net/baidu_38126306/article/details/109634065
上一篇: 讲究门当户对
下一篇: 为什么我的象不能过河