synchronized和RetreenLock鎖區別
1、synchronized是java關鍵字,RetreenLock是個java類
2、synchronized無法獲取鎖狀態,Lock可以判斷是否持有鎖
3、synchronized會自動釋放鎖,Lock需要在finally中unlock()手動釋放鎖
4、使用synchronized,線程1獲取鎖,線程2只能等待;使用Lock,線程1獲取鎖,線程2會嘗試獲取鎖,如果獲取不到,不會一直等待,可以直接結束。
5、synchronized和Lock都是可重入,可中斷的 Synchronized可重入鎖分析 OR Synchronized可重入鎖通俗易懂的簡單分析
6、synchronized適合代碼量少的同步,Lock適合大量代碼同步
volitale和synchronized的區別
- volitale關鍵字提供了一個功能,就是被其修飾的變量在被修改后會被強制刷入到主內存中,
其他處理器的緩存由於遵守了緩存一致性原則,會把這個變量的值從主內存中加載到自己的
緩存中,因此在並發編程中保證了變量的可見性。
- volitale關鍵字會禁止指令重排,從而來保證有序性
- volitale關鍵字不能保證原子性
- synchronized可以保證原子性,通過字節碼指令monitorenter和monitorexit。
- synchronized可以保證可見性
- synchronized關鍵字保證同一時刻只允許一條線程操作,從而保證了有序性
PS:多個線程訪問同一個變量時,一個線程修改了這個變量的值,其他線程能夠立即看到修改后的值,這就是可見性。
