【问题标题】:AtomicInteger vs synchronized blockAtomicInteger 与同步块
【发布时间】:2018-08-26 15:34:07
【问题描述】:

我有一个问题,我需要在 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 块的效果一样吗?

【问题讨论】:

    标签: java multithreading synchronized-block atomicinteger


    【解决方案1】:

    通常,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() 不需要任何同步。

    【讨论】:

    • 感谢 Alexei,提供代码 sn-p。我需要在打印方法中的计数器组上同步。
    • 打印方法计划每分钟运行一次并打印计数器的当前值。
    • 这解决了我的问题。忽略我以前的cmets。谢谢阿列克谢。
    猜你喜欢
    • 2015-12-02
    • 2021-03-18
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    相关资源
    最近更新 更多