Java多线程synchronized同步方法详解
作者:lkc9 时间:2023-06-30 00:39:42
1、synchronized 方法与锁对象
线程锁的是对象。
1)A线程先持有 object 对象的 Lock 锁, B线程可以以异步的方式调用 object 对象中的非 synchronized 类型的方法
2)A线程先持有 object 对象的 Lock 锁, B线程如果在这时调用 object 对象中的 synchronized 类型的方法,则需要等待,也就是同步。
2、脏读(DirtyRead)
示例:
public class DirtyReadTest {
public static void main(String[] args) {
try {
PublicVar publicVar = new PublicVar();
ThreadA thread = new ThreadA(publicVar);
thread.start();
Thread.sleep(200);
publicVar.getValue();
} catch (Exception e) {
e.printStackTrace();
}
}
static class ThreadA extends Thread {
private PublicVar publicVar;
public ThreadA(PublicVar publicVar) {
this.publicVar = publicVar;
}
@Override
public void run() {
super.run();
publicVar.setValue("B", "BB");
}
}
static class PublicVar {
public String username = "A";
public String password = "AA";
synchronized public void setValue(String username, String password) {
try {
this.username = username;
Thread.sleep(1000);
this.password = password;
System.out.println("setValue method thread name = " + Thread.currentThread().getName() + "\tusername = " + username + "\tpassword = " + password);
} catch (Exception e) {
e.printStackTrace();
}
}
// 因为 getValue 方法是非 synchronized 方法,所以造成了脏读
public void getValue() {
System.out.println("getValue method thread name = " + Thread.currentThread().getName() + "\tusername = " + username + "\tpassword = " + password);
}
}
}
结果如图:
3、synchronized 锁重入
"可重入锁"的概念是:
自己可以再次活得自己的内部锁。比如有1条线程获得了某个对象的锁,此时这个对象锁还没有释放,当其再次想要获取这个对象的锁的时候还是可以获取的,如果不可以锁重入的话,就会造成死锁。
可重入锁也支持在父子类继承的环境中:在继承中,子类是完全可以通过“可重入锁”调用父类的同步方法的。
4、出现异常,锁自动释放
线程出现异常,会释放当前线程的锁
来源:https://www.cnblogs.com/lkc9/p/12459735.html
标签:Java,synchronized,同步
0
投稿
猜你喜欢
基于java SSM springboot实现抗疫物质信息管理系统
2021-12-01 13:46:34
Maven打包jar包没有主属性问题解决方案
2023-11-25 06:56:32
Java List 用法实例详解
2022-11-29 05:27:20
新手学习Java对Redis简单操作
2023-09-10 05:05:41
spring声明式事务 @Transactional 不回滚的多种情况以及解决方案
2023-07-06 10:50:33
Android中ListActivity用法实例分析
2022-08-14 21:52:34
c#中虚函数的相关使用方法
2022-10-25 05:44:53
谈谈HttpClient使用详解
2022-11-03 08:19:02
IntelliJ IDEA 如何配置git的操作方法
2021-12-28 11:24:44
C#和SQL实现的字符串相似度计算代码分享
2021-06-10 14:23:20
MyBatis字段名和属性名不一致的解决方法
2022-12-15 18:15:22
C#委托与匿名委托详解
2023-02-24 21:12:41
详解在Spring3中使用注解(@Scheduled)创建计划任务
2022-11-14 15:39:34
string boot 与 自定义interceptor的实例讲解
2023-10-27 17:03:20
Java通过CMD方式读取注册表任意键值对代码实践
2021-10-10 19:56:40
Java设计模式之工厂模式
2023-12-18 01:40:50
混合语言编程—C#使用原生的Directx和OpenGL绘图的方法
2022-06-18 14:36:41
Java 8新特性方法引用详细介绍
2023-06-22 08:31:50
详解如何为SpringBoot项目中的自定义配置添加IDE支持
2021-10-07 05:51:01
C#在Excel表格中插入、编辑和删除批注
2023-01-12 13:52:20