日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

synchronized关键字原理

發布時間:2025/7/14 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 synchronized关键字原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

認識synchronized

對于寫多線程程序的人來說,經常碰到的就是并發問題,對于容易出現并發問題的地方價格synchronized基本上就搞定 了,如果說不考慮性能問題的話,這一操絕對能應對百分之九十以上的情況,若對于性能方面有要求的話就需要額外的知識比如讀寫鎖等等。本文目的先了解透徹synchronized的基本原理。

Synchronized的基本使用

Synchronized的作用主要有三個:

(1)確保線程互斥的訪問同步代碼

(2)保證共享變量的修改能夠及時可見

(3)有效解決重排序問題。

從語法上講,Synchronized總共有三種用法:

(1)修飾普通方法

(2)修飾靜態方法

(3)修飾代碼塊

public class SynchronizedDemo {public void method() {synchronized (this) {System.out.println("Method 1 start");}} }

對于上述方法我們很容易就知道是線程安全的,具體是怎么做的到的線程安全呢,對class通過javap編譯結果如下:

monitorenter

每個對象有一個監視器鎖(monitor)。當monitor被占用時就會處于鎖定狀態,線程執行monitorenter指令時嘗試獲取monitor的所有權,過程如下:

1、如果monitor的進入數為0,則該線程進入monitor,然后將進入數設置為1,該線程即為monitor的所有者。

2、如果線程已經占有該monitor,只是重新進入,則進入monitor的進入數加1.

3、如果其他線程已經占用了monitor,則該線程進入阻塞狀態,直到monitor的進入數為0,再重新嘗試獲取monitor的所有權。

monitorexit

執行monitorexit的線程必須是objectref所對應的monitor的所有者。

指令執行時,monitor的進入數減1,如果減1后進入數為0,那線程退出monitor,不再是這個monitor的所有者。其他被這個monitor阻塞的線程可以嘗試去獲取這個 monitor 的所有權。

通過這兩段描述,我們應該能很清楚的看出Synchronized的實現原理,Synchronized的語義底層是通過一個monitor的對象來完成,其實wait/notify等方法也依賴于monitor對象,這就是為什么只有在同步的塊或者方法中才能調用wait/notify等方法,否則會拋出java.lang.IllegalMonitorStateException的異常的原因。

原理總結

每個對象都有一個內部的鎖或者叫做是監視器,稱之為monitor,當一個方法加上synchronized關鍵字的時候,如果一個線程想執行這個方法那么首先需要獲取這個對象的monirot權限,對應到指令上面也就是需要獲取monitorenter 指令,如果一個對象獲取到這個指令之后,那么monitor的進入數為1,當其他線程再次獲取的時候發現這個對象的monitor對象被別的線程所占用,那么進入阻塞狀態,知道占用這個對象的線程執行monitorexit,設置進入數為0為止。

如果synchronized加在普通方法上,那么有效的范圍是多個線程執行同一個對象的方法。通過上面的解釋應該比較容易理解了,因為不同的對象獲取的是不同的monitor監視器,自然也就不存在占用–等待的過程了。如果是加載static方法上那么需要獲取的就是這個對象所在class的Class對象,所以此時不管是幾個對象,對應的都是同一個class對象,也就是說多個線程又存在對同一個monitor的占用—等待的過程了。所以說加載static上是對于整個類文件有效。

轉載于:https://www.cnblogs.com/yifanSJ/p/9221076.html

總結

以上是生活随笔為你收集整理的synchronized关键字原理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。