我有一个问题,我需要在 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
提交
取消