Java多執行緒程式設計核心技術之原子類
阿新 • • 發佈:2019-01-08
使用原子類進行i++操作
除了在i++操作時使用synchronized關鍵字實現同步外,還可以使用AtomicInteger原子類進行實現。
原子操作是不能分割的整體,沒有其他執行緒能夠中斷或檢查正在原子操作中的變數。一個原子型別(atomic)就是一個原子操作可用的型別,它可以在沒有鎖的情況下做到執行緒安全。
檔案AddCountThread.java程式碼如下:
package com.example.demo; import java.util.concurrent.atomic.AtomicInteger; public class AddCountThread extends Thread { private AtomicInteger count = new AtomicInteger(0); @Override public void run() { for (int i = 0; i < 10000; i++) { System.out.println(count.incrementAndGet()); } } }
檔案Run.java程式碼如下:
package com.example.demo; import com.example.demo.AddCountThread; public class Run { public static void main(String[] args) { AddCountThread countService = new AddCountThread(); Thread t1 = new Thread(countService); t1.start(); Thread t2 = new Thread(countService); t2.start(); Thread t3 = new Thread(countService); t3.start(); Thread t4 = new Thread(countService); t4.start(); Thread t5 = new Thread(countService); t5.start(); } }
執行結果:
原子類也並不完全安全
原子類在具有邏輯性的情況下輸出結果也具有隨機性。
原子類方法是原子性的,但是方法與方法之間的呼叫卻不是原子的(即不同的執行緒呼叫原子類方法)。解決這樣的問題需要用到同步(synchronized)。