国产成人精品亚洲777人妖,欧美日韩精品一区视频,最新亚洲国产,国产乱码精品一区二区亚洲

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

深入分析JAVA Synchronized關(guān)鍵字

瀏覽:98日期:2022-08-30 17:02:41

并發(fā)一致性的概念?

是利用鎖的機(jī)制來(lái)實(shí)現(xiàn)同步的,鎖機(jī)制有如下兩種特性:

互斥性:即在同一時(shí)間只允許一個(gè)線程持有某個(gè)對(duì)象鎖,通過(guò)這種特性來(lái)實(shí)現(xiàn)多線程中的協(xié)調(diào)機(jī)制,這樣在同一時(shí)間只有一個(gè)線程對(duì)需同步的代碼塊(復(fù)合操作)進(jìn)行訪問(wèn)?;コ庑晕覀円餐Q為操作的原子性。

可見性:必須確保在鎖被釋放之前,對(duì)共享變量所做的修改,對(duì)于隨后獲得該鎖的另一個(gè)線程是可見的(即在獲得鎖時(shí)應(yīng)獲得最新共享變量的值),否則另一個(gè)線程可能是在本地緩存的某個(gè)副本上繼續(xù)操作從而引起不一致。

Synchronized的用法?

1.同步方法

同步非靜態(tài)方法

/** * Synchronized關(guān)鍵字的用法 * @author Administrator * */public class SynchronizeDemo01 { /** * 修飾非靜態(tài)方法 * @Description: TODO * @returnType: void */ public synchronized void accessResources1(){ try { TimeUnit.SECONDS.sleep(2); System.out.println(Thread.currentThread().getName()+' is running!'); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { //非靜態(tài)方法的測(cè)試 SynchronizeDemo01 demo01 = new SynchronizeDemo01(); for (int i = 0; i < 5; i++) { new Thread(demo01::accessResources1).start(); } }}

同步靜態(tài)方法

/** * Synchronized關(guān)鍵字的用法 * @author Administrator * */public class SynchronizeDemo01 { /** * 修飾靜態(tài)方法 * @Description: TODO * @returnType: void */ public synchronized static void accessResources0(){ try { TimeUnit.SECONDS.sleep(2); System.out.println(Thread.currentThread().getName()+' is running!'); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { //靜態(tài)方法的測(cè)試 for(int i=0;i<5;i++){ new Thread(SynchronizeDemo01::accessResources0).start(); } }}

2.同步代碼塊

代碼塊對(duì)象,獲取對(duì)象鎖,在 Java 中,每個(gè)對(duì)象都會(huì)有一個(gè) monitor 對(duì)象,這個(gè)對(duì)象其實(shí)就是 Java 對(duì)象的鎖,通常會(huì)被稱為“內(nèi)置鎖”或“對(duì)象鎖”。類的對(duì)象可以有多個(gè),所以每個(gè)對(duì)象有其獨(dú)立的對(duì)象鎖,互不干擾。

/** * Synchronized關(guān)鍵字的用法 * @author Administrator * */public class SynchronizeDemo01 { /** * synchronized代碼塊(對(duì)象),this指的是當(dāng)前對(duì)象 * @Description: TODO * @returnType: void */ public void accessResources2(){ synchronized(this){ try {TimeUnit.SECONDS.sleep(2);System.out.println(Thread.currentThread().getName()+' is running!'); } catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace(); } } } public static void main(String[] args) { //非靜態(tài)方法的測(cè)試 SynchronizeDemo01 demo01 = new SynchronizeDemo01(); for (int i = 0; i < 5; i++) { new Thread(demo01::accessResources2).start(); } }}

代碼塊 (類.class),獲取類鎖,在 Java 中,針對(duì)每個(gè)類也有一個(gè)鎖,可以稱為“類鎖”,類鎖實(shí)際上是通過(guò)對(duì)象鎖實(shí)現(xiàn)的,即類的 Class 對(duì)象鎖。每個(gè)類只有一個(gè) Class 對(duì)象,所以每個(gè)類只有一個(gè)類鎖。

/** * Synchronized關(guān)鍵字的用法 * @author Administrator * */public class SynchronizeDemo01 { /** * synchronized代碼塊(類.class) * @Description: TODO * @returnType: void */ public void accessResources3(){ synchronized(SynchronizeDemo01.class){ //有Class對(duì)象的所有的對(duì)象都共同使用這一個(gè)鎖 try {TimeUnit.SECONDS.sleep(2);System.out.println(Thread.currentThread().getName()+' is running!'); } catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace(); } } } public static void main(String[] args) { //非靜態(tài)方法的測(cè)試 SynchronizeDemo01 demo01 = new SynchronizeDemo01(); for (int i = 0; i < 5; i++) { new Thread(demo01::accessResources3).start(); } }}

Java對(duì)象的monitor對(duì)象的作用?

1.當(dāng)某一線程想要占有這個(gè)對(duì)象的時(shí)候,首先判斷monitor 的計(jì)數(shù)器是不是0,如果是0表示還沒(méi)有線程占有,這個(gè)時(shí)候線程可以占有這個(gè)對(duì)象,并且對(duì)這個(gè)對(duì)象的monitor+1;如果不為0,表示這個(gè)線程已經(jīng)被其他線程占有,那么這個(gè)線程需要等待。當(dāng)線程釋放占有權(quán)的時(shí)候,monitor-1。

2. 同一線程可以對(duì)同一對(duì)象進(jìn)行多次加鎖,+1,+1,重入性

Synchronized代碼塊的加鎖機(jī)制?

1.對(duì)代碼塊的加鎖,通過(guò)反編譯文件,發(fā)現(xiàn)在Monitorenter和Monitorexit中間是加鎖的部分

深入分析JAVA Synchronized關(guān)鍵字

2.對(duì)方法的加鎖,通過(guò)反編譯文件,發(fā)現(xiàn)標(biāo)有ACC_SYNCHRONIZED標(biāo)識(shí)的為加鎖方法

深入分析JAVA Synchronized關(guān)鍵字

Java虛擬機(jī)中幾種鎖的對(duì)比?

深入分析JAVA Synchronized關(guān)鍵字

無(wú)狀態(tài)鎖:沒(méi)有加鎖

偏向鎖:在對(duì)象第一次被某一線程占有的時(shí)候,會(huì)將“是否偏向鎖”字段置為1,“鎖標(biāo)志位”記為01,寫入線程號(hào),當(dāng)其他的線 程訪問(wèn)的時(shí)候,就會(huì)發(fā)生 競(jìng)爭(zhēng),如果競(jìng)爭(zhēng)失敗則升級(jí)為輕量級(jí)鎖。偏向鎖更加偏向第一次訪問(wèn)的線程獲取鎖成功。

  輕量級(jí)鎖:線程有交替適用,互斥性不是很強(qiáng),當(dāng)偏向鎖通過(guò)CAS算法獲取鎖失敗,把鎖標(biāo)志位置為00。

重量級(jí)鎖:強(qiáng)互斥,鎖標(biāo)志位為10,等待時(shí)間長(zhǎng)

以上就是深入分析JAVA Synchronized關(guān)鍵字的詳細(xì)內(nèi)容,更多關(guān)于JAVA Synchronized關(guān)鍵字的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 延津县| 石渠县| 隆回县| 安化县| 南华县| 邻水| 西峡县| 婺源县| 洛阳市| 柘荣县| 全椒县| 威信县| 平邑县| 太和县| 库尔勒市| 茂名市| 宝鸡市| 桑日县| 海盐县| 靖远县| 碌曲县| 资源县| 台东县| 浦北县| 工布江达县| 都江堰市| 游戏| 柳州市| 郓城县| 思茅市| 漠河县| 大悟县| 灵璧县| 南昌市| 沁源县| 巨鹿县| 定安县| 宁蒗| 丰城市| 化州市| 苏尼特左旗|