AtomicInteger 与同步块

我有一个问题,我需要在 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 是否与同步块具有相同的效果?


开心每一天1111
浏览 129回答 1
1回答

哆啦的时光机

通常,AtomicInteger 与同步块的效果不同。但是对于像您这样的简单任务,可以使用 AtomicInteger 来摆脱同步块:AtomicInteger[] counters = new AtomicInteger[100];void increment (int idx){&nbsp; &nbsp; counters[idx].incrementAndGet();}void print(){&nbsp;&nbsp; &nbsp; StringBuffer buf = new StringBuffer ();&nbsp; &nbsp; for( int i=0; i<100; i++;){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;buf.append(",");&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;buf.append(counters[i].get);&nbsp; &nbsp; } //End for&nbsp; &nbsp; System.out.println(buf.toString());}&nbsp;您不需要任何同步print()。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java