synchronized是如何保证代码同步的
本文介绍一下在Java中用于实现线程同步关键字synchronized ,其原理是基于对象锁
(也称为监视器锁)来确保多个线程对共享资源的安全访问。当一个线程进入 synchronized 代码块或方法时,它会尝试获取对象的锁,如果锁已经被其他线程持有,则该线程会被阻塞,直到锁被释放。
synchronized同步原理
具体来说, synchronized 关键字的原理如下:
- 对象锁:每个Java对象都有一个与之关联的对象锁。当一个线程进入 synchronized 代码块或方法时,它会尝试获取该对象的锁。
- 互斥性:
同一时刻只有一个线程
能够持有对象的锁,其他线程需要等待锁释放后才能继续执行。 - 可重入性:
同一个线程可以多次获取
同一个对象的锁,避免死锁情况。 - 内存可见性:线程获取锁时,会清空本地内存并从主内存中读取变量的最新值,释放锁时会将本地内存中的修改刷新到主内存,确保多线程间的内存可见性。
- 监视器对象:在Java中,每个对象都有一个与之相关联的监视器对象(monitor object),用于实现锁的获取和释放。
代码示例
下面使用一个简单的示例代码,演示了 synchronized 如何保证代码同步,由于 synchronized 关键字的作用,每次只有一个线程能够获得锁并执行临界区内的代码,确保了对 count 变量的操作是原子的,保证了 count 累加次数是正确的。
public class SynchronizedExample {
private int count = 0;
public synchronized void increment() {
count++;
}
public static void main(String[] args) {
SynchronizedExample example = new SynchronizedExample();
Thread thread1 = new Thread(() -> {
for (int i = 0; i < 100; i++) {
example.increment();
}
});
Thread thread2 = new Thread(() -> {
for (int i = 0; i < 100; i++) {
example.increment();
}
});
thread1.start();
thread2.start();
try {
thread1.join();
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("count: " + example.count);
}
}
总结
本文简要介绍了synchronized是如何保证代码同步的。
希望对看到本文的你有帮助。
上一篇 待定 |
记得点赞收藏哦!!!
| 下一篇 待定 |