public class VolatileTest implements Runnable{ /* * volatile 標識變量在線程間可見,不具有原子性(賦值後,可能會致使子線程邏輯出錯) * * 在java中,每個線程都自有一塊工做內存區,其中存放這全部線程共享的主內存中的變量值的copy. * 當線程執行時,線程在本身的工做區域中操做這些變量。爲了存取一個共享的變量,一個線程一般先獲取鎖定並去清除它的工做區 * 把這些共享變量從全部線程的共享內存區中正確的裝入本身所在的工做內存區中, * 當線程解鎖時保證該工做內存區中變量的值寫回到共享內存匯中。 * * 一個線程能夠執行的操做有使用(Use)、賦值(assign)、裝載(load)、存儲(store)、鎖定(lock)、解鎖(unlock) * * 主內存能夠執行的操做讀(Read)、寫(write)、鎖定(lock)、解鎖(unlock),注全部操做都是原子性 * * volatile的做用就是強制線程到主內存(共享內存)中讀取變量,而不是去線程工做內存中讀取。從而實現了多個線程間的變量可見 * 從而實現了線程安全的可見性 */ public boolean flag = true; public static void main(String[] args) throws InterruptedException { VolatileTest test = new VolatileTest(); Thread t = new Thread(test); t.start(); Thread.sleep(3000); test.flag = false; Thread.sleep(1000); System.out.println(test.flag); } @Override public void run() { System.out.println("code is running"); boolean runFlag = false; // int i = 10; while(flag){ // while(i<0){ // i--; // try { // Thread.sleep(1000); // } catch (InterruptedException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } runFlag = true; } System.out.println("stoped"); } }
Atomic類的使用java
public class AtomicTest extends Thread{ public static AtomicInteger ai = new AtomicInteger(0); @Override public void run(){ for(int i =0;i<100;i++){ ai.incrementAndGet(); } System.out.println(ai); } public static void main(String[] args) { AtomicTest[] threads = new AtomicTest[10]; for(int i =0;i<threads.length;i++){ threads[i] = new AtomicTest(); } for(int i =0;i<threads.length;i++){ threads[i].start(); } } }