深入理解Java synchronized:原理与规则详解

0 下载量 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`关键字提供了线程安全的并发控制,确保了在多线程环境下资源的正确访问和数据一致性,是编写多线程程序时必须理解和掌握的关键知识点。