一、線程同步方式
1.關鍵字(synchronized)
Java語言的關鍵字,當它用來修飾一個方法或者一個代碼塊的時候,能夠保證在同一時刻最多只有一個線程執行該段代碼。
a) 當兩個並發線程訪問同一個對象object中的這個synchronized(this)同步代碼塊時,一個時間內只能有一個線程得到執行,另一個線程必須等待當前線程執行完這個代碼塊以后才能執行該代碼塊。
b) 當一個線程訪問object的一個synchronized(this)同步代碼塊時,其他線程對object中所有其它synchronized(this)同步代碼塊的訪問將被阻塞。
1 public synchronized void foo( B b ) 2 { 3 System.out.println("當前線程名: " + Thread.currentThread().getName() 4 + " 進入了A實例的foo()方法" ); // ① 5 }
2.同步鎖(lock)
Lock是控制多個線程對共享資源進行訪問的工具.通常,鎖提供了對共享資源的獨占訪問,每次只能有一個,線程對Lock對象加鎖,線程開始訪問共享資源之前,應該先獲得Lock對象。
1 //定義鎖對象 2 private final ReentrantLock lock = new ReentrantLock(); 3 //定義需要保證線程安全的方法 4 public void m(){ 5 lock.lock(); 6 try{ 7 //需要保證線程安全的代碼 8 //...method body 9 } 10 //使用finally塊來保證釋放鎖 11 finally{ 12 lock.unlock(); 13 } 14 }
二、線程安全集合
目前,java支持的線程安全集合類有兩類
a)以Concurrent開頭的集合類,包括ConcurrentHashMap、ConcurrentSkipListMap、ConcurrentSkipListSet、ConcurrentLinkedQueue、ConcurrentLinkedDeque。
b)以CopyOnWrite開頭的集合類,包括CopyOnWriteArrayList、CopyOnWriteArraySet。
另外,ArrayList,LinkedList,HashSet,TreeSet,HashMap,TreeMap等都是線程不安全的.
如果程序中有多個線程可能訪問以上這些集合,就可以使用Collection提供的類方法把這些結婚包裝成線程安全的集合。
HashMap<String,String> m = (HashMap<String, String>) Collections.synchronizedMap(new HashMap<String, String>());
