深入理解Java synchronized:原理与规则详解
70 浏览量
更新于2024-09-01
收藏 92KB PDF 举报
Java中的`synchronized`关键字是实现多线程并发控制的重要机制,它确保了在多线程环境下的数据一致性。每一个Java对象都有且仅有一个同步锁,这意味着`synchronized`是与对象绑定的,而不是与类或者静态方法关联。当你在一个对象上调用`synchronized`方法或访问`synchronized`代码块时,会自动获取该对象的锁,使得在同一时间只有一个线程能够执行这部分代码,实现了线程间的互斥访问。
`synchronized`原理的核心在于它的互斥性。当一个线程获取了对象的锁(例如,通过`synchronized(this)`或`synchronized(obj)`),其他尝试访问相同同步锁的线程将被阻塞,直至当前线程执行完毕并释放锁。这种机制避免了并发访问时可能出现的数据竞争问题,确保了在特定时刻,只有单一线程能执行特定对象上的同步代码。
`synchronized`的基本规则如下:
1. 互斥性:一个线程持有某个对象的锁后,其他线程对该对象的相同`synchronized`方法或代码块的访问会被阻塞,直到锁被释放。
2. 非阻塞性:线程可以继续执行对象的非`synchronized`代码块,即使它们不能立即进入`synchronized`部分。这允许并发访问对象的部分资源。
3. 扩展性:同一对象上的`synchronized`代码块之间是互斥的,但不同对象的`synchronized`代码块可以同时执行,除非它们共享相同的锁。
举例来说,考虑以下`MyRunnable`类的代码片段:
```java
class MyRunnable implements Runnable {
private Object obj = new Object();
public void run() {
synchronized (obj) {
// 这里是synchronized代码块
System.out.println("Thread " + Thread.currentThread().getName() + " is running method A");
// 非同步代码块
doSomeNonSynchronizedTask();
}
}
private void doSomeNonSynchronizedTask() {
// 这里是非synchronized代码,可以在run方法的同步块之外执行
}
}
```
在这个例子中,当一个线程开始执行`run`方法的`synchronized`代码块时,其他线程会阻塞,直到第一个线程完成并释放`obj`的锁。同时,非`synchronized`的`doSomeNonSynchronizedTask`方法可以不受阻塞地执行。
总结来说,Java的`synchronized`关键字提供了线程安全的并发控制,确保了在多线程环境下资源的正确访问和数据一致性,是编写多线程程序时必须理解和掌握的关键知识点。
118 浏览量
115 浏览量
163 浏览量
122 浏览量
161 浏览量
2020-08-30 上传
206 浏览量
161 浏览量
2020-08-30 上传
weixin_38515573
- 粉丝: 8
- 资源: 939
最新资源
- ARDUINO蓝牙例程.rar
- information-retrieval:unipd IR 课程的内容
- 家装空间3d模型
- 楚多齐尔
- BBSxp论坛 小蜜蜂
- MIPCMS内容管理系统 V2.1.2
- rosjava_core:支持 Android 的纯 Java ROS 实现
- darlinf-portar-proyectos
- react-app46031239595955455
- budget_tracker
- React_Krowdy-Video
- ionic HTML5 移动端开源框架 v3.7.1
- randomwalk:创建任意维度的随机游走-matlab开发
- Star Trek: Continuum:重制《星际迷航:完全重制家庭世界》-开源
- 企业广场:企业广场
- AndroidScanQRCode.rar.rar