У меня проблема, когда мне нужно синхронизировать доступ к массиву целых чисел в 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 тот же эффект, что и синхронизированный блок?