前言
併發的情況下,非常多的操作都存在併發問題。
原理
程序目的爲:run裏面的部分代碼只執行一遍
public class LockDemo14 implements Runnable { public static boolean flag = false; public static void main(String[] args) { Thread thread1 = new Thread(new LockDemo14()); Thread thread2 = new Thread(new LockDemo14()); Thread thread3 = new Thread(new LockDemo14()); Thread thread4 = new Thread(new LockDemo14()); Thread thread5 = new Thread(new LockDemo14()); thread1.start(); thread2.start(); thread3.start(); thread4.start(); thread5.start(); } @Override public void run() { if(flag == false){ flag = true; System.out.println("執行run方法"); } } }
運行結果:爲了效果明顯可以打斷點
爲了不出現上面的情況,一種簡單方式就是加鎖,今天不討論加鎖,今天我們使用原子類(AtomicBoolean)。
public class LockDemo14 implements Runnable { public static AtomicBoolean flag = new AtomicBoolean(false); public static void main(String[] args) { Thread thread1 = new Thread(new LockDemo14()); Thread thread2 = new Thread(new LockDemo14()); Thread thread3 = new Thread(new LockDemo14()); Thread thread4 = new Thread(new LockDemo14()); Thread thread5 = new Thread(new LockDemo14()); thread1.start(); thread2.start(); thread3.start(); thread4.start(); thread5.start(); } @Override public void run() { if(flag.compareAndSet(false,true)){ System.out.println("執行run方法"); } } }
運行結果:
很完美的解決了我的問題。
擴展
JDK還給我們提供了很多類似的原子類(AtomicInteger,AtomicLong等等),都在concurrent.atomic下。
總結
原子類對比鎖的優勢,減少阻塞,操作方便。