我有一個問題,我需要在 java 中同步對整數數組的訪問。我的代碼看起來像這樣。 Class X { int[] counters = new int[100]; Object lock = new Object (); void increment (int idx){ synchronized (lock){ ++counters[idx]; } } void print(){ StringBuffer buf = new StringBuffer (); synchronized (lock){ for( int i=0; i<100; i++;){ buf.append(","); buf.append(counters [i]); } //End for }//End synchronized System.out.println(buf.toString()); } }目前我正在使用單鎖來同步對整數數組的訪問。但我想為每個計數器使用一個鎖。所以我將代碼修改為如下所示。 Class X { int[] counters = new int[100]; Object[] locks = new Object[100]; static{ for(int i=0;i<100;i++){ locks [i] = new Object (); } } void increment (int idx){ synchronized (locks[idx]){ ++counters[idx]; } } void print(){ StringBuffer buf = new StringBuffer (); for( int i=0; i<100; i++;){ buf.append(","); synchronized (lock[i]){ buf.append(counters [i]); }//End synchronized } //End for System.out.println(buf.toString()); } }但是我的同事建議我使用 AtomicInteger 而不是同步塊。AtomicInteger 是否與同步塊具有相同的效果?
1 回答

哆啦的時光機
TA貢獻1779條經驗 獲得超6個贊
通常,AtomicInteger 與同步塊的效果不同。但是對于像您這樣的簡單任務,可以使用 AtomicInteger 來擺脫同步塊:
AtomicInteger[] counters = new AtomicInteger[100];
void increment (int idx){
counters[idx].incrementAndGet();
}
void print(){
StringBuffer buf = new StringBuffer ();
for( int i=0; i<100; i++;){
buf.append(",");
buf.append(counters[i].get);
} //End for
System.out.println(buf.toString());
}
您不需要任何同步print()。
添加回答
舉報
0/150
提交
取消