保证多线程操作的原子性

volatile

关键字只保证了元素的可见性,即对变量的修改各个线程都会立即得到修改后的值


采用synchronized:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Test {
     public  int inc = 0 ;
 
     public synchronized void increase() {
         inc++;
     }
 
     public static void main(String[] args) {
         final Test test = new Test();
         for ( int i= 0 ;i< 10 ;i++){
             new Thread(){
                 public void run() {
                     for ( int j= 0 ;j< 1000 ;j++)
                         test.increase();
                 };
             }.start();
         }
 
         while (Thread.activeCount()> 1 //保证前面的线程都执行完
             Thread.yield();
         System.out.println(test.inc);
     }
}

采用Lock:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class Test {
     public  int inc = 0 ;
     Lock lock = new ReentrantLock();
 
     public  void increase() {
         lock.lock();
         try {
             inc++;
         } finally {
             lock.unlock();
         }
     }
 
     public static void main(String[] args) {
         final Test test = new Test();
         for ( int i= 0 ;i< 10 ;i++){
             new Thread(){
                 public void run() {
                     for ( int j= 0 ;j< 1000 ;j++)
                         test.increase();
                 };
             }.start();
         }
 
         while (Thread.activeCount()> 1 //保证前面的线程都执行完
             Thread.yield();
         System.out.println(test.inc);
     }
}

采用AtomicInteger:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Test {
     public  AtomicInteger inc = new AtomicInteger();
 
     public  void increase() {
         inc.getAndIncrement();
     }
 
     public static void main(String[] args) {
         final Test test = new Test();
         for ( int i= 0 ;i< 10 ;i++){
             new Thread(){
                 public void run() {
                     for ( int j= 0 ;j< 1000 ;j++)
                         test.increase();
                 };
             }.start();
         }
 
         while (Thread.activeCount()> 1 //保证前面的线程都执行完
             Thread.yield();
         System.out.println(test.inc);
     }
}

猜你喜欢

转载自blog.csdn.net/xuedengyong/article/details/79897361