synchronized 的实现原理
时间: 2023-09-05 21:12:42 浏览: 38
synchronized是Java中实现线程同步的关键字之一。它是通过Java对象头中的Monitor来实现的。Java对象头中包含了一些与线程同步相关的信息,其中就包括了一个指向持有该对象锁的线程的指针。当一个线程尝试获取一个对象的锁时,它首先会检查对象头中的Monitor信息,判断是否已经有线程持有该对象锁。如果没有,则该线程可以获取锁,并将自己的线程ID保存在对象头的Monitor中。如果有其他线程已经持有该对象锁,那么当前线程就会进入阻塞状态,等待其他线程释放锁。
此外,synchronized还实现了锁的可重入性。可重入锁意味着当一个线程已经持有了一个对象锁后,再次请求该对象锁时,仍然可以获得该锁。这样就避免了线程自己因为已经持有锁而被阻塞。
另外,synchronized还保证了线程执行的有序性。尽管编译器和处理器为了提升代码效率可能进行指令重排序,但synchronized关键字保证了被修饰的代码在同一时间内只能被同一线程访问。这样就保证了被修饰的代码块的执行顺序不会被改变,从而保证了有序性。
总结来说,synchronized的实现原理是通过Java对象头中的Monitor来实现线程同步。它通过检查对象头的Monitor信息来判断是否能够获取对象锁,同时实现了锁的可重入性和保证了线程执行的有序性。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* [Java中synchronized实现原理详解](https://download.csdn.net/download/weixin_38556394/12768407)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
- *2* *3* [synchronized原理](https://blog.csdn.net/xyy1028/article/details/106042888)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]