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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java实现关键词云_Java synchronized 关键词详细说明

發布時間:2023/12/4 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java实现关键词云_Java synchronized 关键词详细说明 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Java synchronized 關鍵詞詳細說明

外置專業技能點系統進程和進程的定義

進程建立方法

進程的情況情況變換

線程安全的定義

synchronized 關鍵詞的幾類使用方法裝飾非靜態數據組員方式synchronized?public?void?sync(){

}

裝飾靜態數據組員方式synchronized?public?static?void?sync(){

}

類鎖編碼塊synchronized?(類.class){

}

目標鎖編碼塊synchronized?(this|目標){

}

synchronized 裝飾非靜態方法時能夠看作是鎖 this 目標,裝飾靜態方法時能夠看作是鎖方式所屬的類。

synchronized 關鍵詞的壓根體制

每個進程要想瀏覽被 synchronized 裝飾的編碼塊,還要獲得 synchronized 申明的鎖。假如2個進程的總體目標是同一個鎖,就會出現堵塞的狀況,因此2個進程不可以另外瀏覽同一個鎖下的編碼,確保了c#多線程在實行時最后結果不容易錯誤。這與共享資源自變量是不是為靜態數據不相干。

好多個事例

目標鎖public?class?ThreadDemo?extends?Thread?{

@Override

public?synchronized?void?run()?{

for?(int?i?=?0;?i?

Main.i++;

}

System.out.println("實行進行");

}

}

立即將承繼的 run() 方式標識為 synchronized ,功效是對 Main 類中的 i 自變量做 10000 次累積實際操作。public?class?Main?{

static?int?i?=?0;

public?static?void?main(String[]?args)?throws?InterruptedException?{

ThreadDemo?threadDemo=new?ThreadDemo();

Thread?t1?=?new?Thread(threadDemo);

Thread?t2?=?new?Thread(threadDemo);

Thread?t3?=?new?Thread(threadDemo);

Thread?t4?=?new?Thread(threadDemo);

t1.start();

t2.start();

t3.start();

t4.start();

t1.join();

t2.join();

t3.join();

t4.join();

System.out.println(i);

}

}

//輸出結果:

//實行進行

//實行進行

//實行進行

//實行進行

//40000

能夠看見當4個進程所有實行結束以后,自變量 i 取得成功的累積了 40000 次,沒有出現遺失實際操作的狀況。

假如人們將 main() 方式改動以下:public?static?void?main(String[]?args)?throws?InterruptedException?{

Thread?t1?=?new?ThreadDemo();

Thread?t2?=?new?ThreadDemo();

Thread?t3?=?new?ThreadDemo();

Thread?t4?=?new?ThreadDemo();

t1.start();

t2.start();

t3.start();

t4.start();

t1.join();

t2.join();

t3.join();

t4.join();

System.out.println(i);

}

//輸出結果:

//實行進行

//實行進行

//實行進行

//實行進行

//27579

能夠看見遺失了許多的累積實際操作。觀查前后左右2個 main() 方式建立進程的方法能夠發覺,前邊的 main() 方式是應用了同一個目標來建立了4個不一樣的進程,然后一個 main() 方式應用了4個不一樣的 ThreadDemo 目標建立了4個進程。人們用 synchronized 裝飾的是一個非靜態數據友元函數,等于對該方式建立了 this 的目標鎖。在第一個 main() 方式中應用同一個目標來建立 4 個不一樣進程就會讓 4 個進程角逐同一個目標鎖,那樣,在同一時間內,僅能有一個進程能瀏覽 synchronized 裝飾的方式。而在第二種 main() 方式中,4 個進程分別相匹配一個目標鎖,4 個進程中間沒有市場競爭關聯,目標鎖當然沒法起效。

類鎖public?class?ThreadDemo?extends?Thread?{

@Override

public?void?run()?{

synchronized?(ThreadDemo.class)?{

for?(int?i?=?0;?i?

Main.i++;

}

System.out.println("實行進行");

}

}

}

將裝飾方式的 synchronized 改成對 ThreadDemo.class 鎖上的編碼塊public?class?ThreadDemo2?extends?Thread?{

@Override

public?void?run()?{

synchronized?(ThreadDemo2.class)?{

for?(int?i?=?0;?i?

Main.i++;

}

System.out.println("實行進行");

}

}

}

再建立一個同樣的類取名為 ThreadDemo2 ,與 ThreadDemo 不一樣的是,ThreadDemo2 中,synchronized 對 ThreadDemo2.class 鎖上。public?static?void?main(String[]?args)?throws?InterruptedException?{

Thread?t1?=?new?ThreadDemo();

Thread?t2?=?new?ThreadDemo();

Thread?t3?=?new?ThreadDemo2();

Thread?t4?=?new?ThreadDemo2();

t1.start();

t2.start();

t3.start();

t4.start();

t1.join();

t2.join();

t3.join();

t4.join();

System.out.println(i);

}

//輸出結果:

//實行進行

//實行進行

//實行進行

//實行進行

//33054

4 個進程各自由 ThreadDemo 和 ThreadDemo2 來建立,顯而易見獲得的結果與預估的 40000 不符合。假如人們將 ThreadDemo2 中的 synchronized 改成對 ThreadDemo.class 鎖上:public?class?ThreadDemo2?extends?Thread?{

@Override

public?void?run()?{

synchronized?(ThreadDemo.class)?{

for?(int?i?=?0;?i?

Main.i++;

}

System.out.println("實行進行");

}

}

}

//輸出結果:

//實行進行

//實行進行

//實行進行

//實行進行

//40000

能夠看見,盡管是申明在2個不一樣的類中的 synchronized 編碼塊,可是因為全是對 ThreadDemo.class 鎖上,因此 4 個進程中間還是創建了市場競爭關聯,另外只有有一個進程瀏覽被 synchronized 裝飾的編碼。

總結

以上是生活随笔為你收集整理的java实现关键词云_Java synchronized 关键词详细说明的全部內容,希望文章能夠幫你解決所遇到的問題。

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