同步的意義:
如果沒有同步,一個線程的變化就不會被其他線程看到。同步不僅可以阻止一個縣城看到對象處于不一致的狀態之中,它還可以保證進入同步方法或者同步代碼塊的每一個線程,都看到同一個鎖保護之前所有的修改效果。
共享對象引用
共享對象引用方法:
1.保存在靜態域中,作為類初始化的一部分
2.將它保存在volatile域、final域或者通過正常鎖定訪問的域中。
3.將它放到并發集合
同步的基本方法:
1.繼承 extends Thread
2.實現implement Runnbale
3.實現callable
用Runnbale:runnable可以共用一個實例,實現資源共享。
java.util.concurrent中更高級的工具分為三類:
1.Executor Framwork
2.并發集合(Current Collection):CurrentHashmap 、Collections.SynchronizedMap 、Hashtable
3.同步器 Synchronizer: CountDownLatch
線程的生命周期:
新建 start() 就緒 運行 dead
獲得處理器資源 失去處理器資源
阻塞:sleep時間到、IO方法返回、獲得同步鎖
dead:調用stop()、destroy(),run()執行完成,Error或Exception
volatile:
非原子性操作不可使用,例如++,
例子:(AtomicLong)
單例模式
(餓漢模式)
public class Singleton{
private static Singleton instance=new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return insance;
}
}
Java提供四中同步方法:
http://blog.csdn.net/monkey_d_meng/article/details/6251879/
1.notify() 、 wait()生產者消費者:
2.BlockingQueue
線程池:
允許客戶將后臺線程異步處理的工作加入隊列,客戶端可以調用一個方法,讓后臺線程完成了已經在隊列中的所有工作之后,優雅的結束自己。
ExecutorService executor= Executors.newFixedThreadPool(3);
for (int i = 0; i < 10; i++) {
final int index = i;
executor.execute(new Runnable() {
public void run() {
try {
System.out.println(index);
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
executor.shutdown();
}
}
});
}
}