初步使用synchronized及心得

2021-09-24 10:40:10 字數 1505 閱讀 1226

假設需要實現以下功能:設計乙個併發程式,併發10個執行緒,每個執行緒累加scount一百萬次,將scount加到一千萬

public

class

synctest

implements

runnable

private

void

increasecount()

}}public

static

void

main

(string[

] args) throws interruptedexception

thread.

sleep

(1000);

system.out.

println

("\n"

+scount);}

}

我已執行緒需要使用到的runnable是否唯一將實現方法分為兩類

1,用synchronized直接修飾increasecount()方法(例項為鎖);

2,用synchronized static修飾increasecount()方法(類為鎖);

3,用synchronized(this)將increasecount的for迴圈包裹住(例項為鎖);

4,用synchronized(synctest.class)將increasecount的for迴圈包裹住(類為鎖);

5,宣告乙個物件lock,確保其是唯一的,用synchronized(lock)將increasecount的for迴圈包裹住(例項為鎖);

1,用synchronized static修飾increasecount()方法(類為鎖);

2,用synchronized(synctest.class)將increasecount的for迴圈包裹住(類為鎖);

3,宣告乙個物件lock, 用static修飾lock, 用synchronized(lock)將increasecount的for迴圈包裹住(例項為鎖);

通過以上解決之法可以看出,關鍵點就是不管鎖住的是例項還是類,只要其是唯一的,就可以實現執行緒同步累加到目標值.

此外一定要注意鎖的影響範圍,比如類鎖會影響到所有用此類為鎖的例項物件,如無必要,應該縮小作用範圍,比如使用靜態例項作為鎖.

還要注意在宣告專用鎖物件的時候,盡量不要使用string lock = ""這種常量申明方式,因為其在全域性的常量池裡都是唯一的,

鎖的範圍太大,可能會被使用同樣方式的鎖方法影響,最好使用string lock = new string();並確保在使用中鎖住的物件例項是獨有的即可.

volatile和synchronized的區別

關於可見性的問題 可見性 即當讀寫兩個執行緒同時訪問同乙個變數時,用於確保寫執行緒更新變數後,讀執行緒再訪問該 變數時可以讀取到該變數最新的值。volatile和synchronized的區別 1.volatile本質是在告訴jvm當前變數在暫存器 工作記憶體 中的值是不確定的,需要從主存中讀取 s...

volatile和synchronize的區別

1.對變數的寫入操作不依賴變數的當前值,或者你能確保只有單個執行緒更新變數的值。2.該變數沒有包含在具有其他變數的不變式中。volatile僅能使用在變數級別 synchronized則可以使用在變數 方法 和類級別的 volatile僅能實現變數的修改可見性,不能保證原子性 而synchroniz...

volatile和synchronized的區別

public class runthread extends thread public void setrunning boolean isrunning override public void run system.out.println 執行緒執行完成了 public class run c...