執行緒安全變數及關鍵字
阿新 • • 發佈:2018-12-28
1、synchronized關鍵字,代表這個方法加鎖,相當於不管哪一個執行緒(例如執行緒A),執行到這個方法時,都要檢查有沒有其它執行緒B(或者C、 D等)正在用這個方法(或者該類的其他同步方法),有的話要等正在使用synchronized方法的執行緒B(或者C 、D)執行完這個方法後再執行此執行緒A,沒有的話,鎖定呼叫者,然後直接執行。它包括兩種用法:synchronized 方法和 synchronized 塊。
2、volatile
一個型別 修飾符(type specifier),就像大家更熟悉的const一樣,它是被設計用來修飾被不同執行緒訪問和修改的 變數。 volatile使用場景
AtomicInteger提供原子操作來進行Integer的使用,因此十分適合高併發情況下的使用
4、ReentrantLockpackage com.java.my; import com.java.my.service.testService; import java.util.concurrent.atomic.AtomicInteger; /** * @author wanjiadong * @description * @date Create in 9:53 2018/1/31 */ public class test1 { static AtomicInteger count = new AtomicInteger(0); static int n = 0; public static void main(String[] args) throws Exception { //第一種newInstance例項一個物件,通常與forName()配合使用 // testService t = (testService) Class.forName("com.java.my.service.testService").newInstance(); // String str = t.checkName("ff"); // // //使用反射 // Class<?> c = Thread.currentThread().getContextClassLoader().loadClass("com.java.my.service.testService"); // Object cStr = c.getMethod("checkName",String.class).invoke(c.newInstance(),"ff"); // System.out.println(cStr.toString()); //System.out.println(count.get()); MyThread myThread1 = new MyThread(); MyThread myThread2 = new MyThread(); myThread1.start(); myThread2.start(); Thread.sleep(10000); System.out.println("count最終執行結果為"+count.get()); System.out.println("n最終執行結果為"+n); } static class MyThread extends Thread { public void run(){ for(int i=0;i<10000;i++){ for(int j=0;j<5;j++){ count.incrementAndGet(); n++; System.out.println("count="+count.get()); System.out.println("n="+n); } } } } }
package com.java.my; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; /** * @author wanjiadong * @description * @date Create in 15:48 2018/2/1 */ public class test3 { public static void main(String[] args) { ExecutorService executorService = Executors.newFixedThreadPool(3); ReentrantLock lock = new ReentrantLock(); Condition con = lock.newCondition(); Runnable run = new Runnable() { @Override public void run() { System.out.println("pre:"+lock.toString()); lock.lock(); try { con.await(5, TimeUnit.SECONDS); } catch (InterruptedException e) { e.printStackTrace(); } finally { System.out.println("post:"+lock.toString()); lock.unlock(); } } }; for (int i=0;i<4;i++){ executorService.execute(run); } executorService.shutdown(); } }