多线程安全之automic

import java.util.concurrent.atomic.AtomicInteger;

/**

  • volatile不具备synchronized关键字的原子性(同步)

  • AtomicInteger具备原子性(同步)
    */
    public class VolatileNoAtomic extends Thread{
    //private static volatile int count;
    private static AtomicInteger count = new AtomicInteger(0);
    private static void addCount(){
    for (int i = 0; i < 1000; i++) {
    //count++ ;
    count.incrementAndGet();
    }
    System.out.println(count);//打印会有延迟,最终结果是10000
    }

    public void run(){
    addCount();
    }

    public static void main(String[] args) {

     VolatileNoAtomic[] arr = new VolatileNoAtomic[100];
     for (int i = 0; i < 10; i++) {
         arr[i] = new VolatileNoAtomic();
     }
    
     for (int i = 0; i < 10; i++) {
         arr[i].start();
     }
    

    }
    }

/**

  • 多个AtomicInteger的方法执行不具备原子性(一个方法有原子性)
  • @author Administrator

*/
public class AtomicUse {
private static AtomicInteger count = new AtomicInteger(0);
//多个addAndGet在一个方法内是非原子性的,需要加synchronized进行修饰,保证4个addAndGet整体原子性
/*synchronized/
public synchronized int multiAdd(){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
count.addAndGet(1);
count.addAndGet(2);
count.addAndGet(3);
count.addAndGet(4); //+10
return count.get();
}

public static void main(String[] args) {
    final AtomicUse au = new AtomicUse();

    List ts = new ArrayList();
    for (int i = 0; i < 100; i++) {
        ts.add(new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(au.multiAdd());
            }
        }));
    }

    for(Thread t : ts){
        t.start();
    }
}

}

你可能感兴趣的:(java)