我有一个问题,我需要同步对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与同步块具有相同的作用吗?
答案 0 :(得分:0)
通常,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()
进行任何同步。