AtomicInteger 与同步块
AtomicInteger vs synchronized block
我有一个问题,我需要同步访问 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 和 synchronized 块有同样的效果吗?
一般来说,AtomicInteger 与synchronized 块的作用不同。但是对于像你这样的简单任务,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()
进行任何同步。
我有一个问题,我需要同步访问 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 和 synchronized 块有同样的效果吗?
一般来说,AtomicInteger 与synchronized 块的作用不同。但是对于像你这样的简单任务,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()
进行任何同步。