玩碎Java之synchronized同步锁作用范围的对比

本文深入探讨Java中线程同步机制,包括对象锁和类锁的使用方式及影响。阐述了不同线程如何访问同步和非同步方法,以及这些访问如何受同步锁的影响。通过具体场景解释了线程间如何实现顺序或交叉访问,帮助理解Java并发编程的关键概念。
摘要由CSDN通过智能技术生成

假设ClassA类中有非静态方法methodA/methodB,
现有ClassA的实例cla, 
线程t1/t2 

对象锁

 对象锁
加在非静态方法,或对象实例上

结论

 

2个线程同时访问,
cla的synchronized methodA方法

cla的methodA方法中的synchronized  代码块
2个线程顺序访问,一个线程执行完,另一个线程才能执行当线程 t1 调用某对象的synchronized 方法 或者 synchronized 代码块时,若同步锁未释放,
其他线程调用同一对象的synchronized 方法 或者 synchronized 代码块时将被阻塞,
直至线程 t1 释放该对象的同步锁。
线程t1访问cla的synchronized methodA 或 methodA中的synchronized 代码块,
线程t2访问cla的synchronized methodB 或 methodB中的synchronized 代码块
2个线程顺序访问,一个线程执行完,另一个线程才能执行当线程 t1 调用某对象的synchronized 方法 或者 synchronized 代码块时,若同步锁未释放,
其他线程调用同一对象的其他synchronized 方法 或者 synchronized 代码块时将被阻塞,
直至线程 t1 释放该对象的同步锁。(注意:重点是其他)
线程t1访问cla的synchronized methodA,
线程t2访问cla的methodB(非同步方法)
2个线程交叉访问,无序当线程 t1 调用某对象的synchronized 方法 或者 synchronized 代码块时,无论同步锁是否释放,
其他线程调用同一对象的其他 非 synchronized 方法 或者 非 synchronized 代码块时可立即调用
ClassA的不同实例cla1,cla2
t1访问cla1的synchronized  methodA方法
t2访问cla2的synchronized  methodA方法
2个线程交叉访问,无序不同的实例,持有不同的锁,互不影响,可以同时访问

 

类锁 

 类锁
加在类或静态方法上
结论
public static synchronized void methodA() {}
线程t1/t2同时访问methodA
2个线程顺序访问,一个线程执行完,另一个线程才能执行静态方法是类所有对象共用的,所以进行同步后,该静态方法的锁也是所有对象唯一的。
每次只能有一个线程来访问对象的该非静态同步方法。 
public static synchronized void methodA() {}
public static synchronized void methodB() {}
线程t1访问methodA
线程t2访问methodB
2个线程顺序访问,一个线程执行完,另一个线程才能执行类锁是全局的,每次只能有一个线程来访问对象的该非静态同步方法。 
public static synchronized void methodA() {}
public synchronized void methodB() {}
线程t1访问methodA
线程t2访问cla实例的methodB
2个线程交叉访问,无序类锁和对象锁是不一样的锁,是互相独立的
public static synchronized void methodA() {}
public void methodB() {}
线程t1访问methodA
线程t2访问methodB
2个线程交叉访问,无序同步方法和非同步方法互不影响,可以同时访问

上面的表格排版不好,再放个截图

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值