共享性,互斥性,原子性,可見性,有序性html
http://www.cnblogs.com/paddix/p/5374810.htmljava
********* https://mp.weixin.qq.com/s/anqQfO7bWpNTcS6Po4Rkww併發
Synchronized及其實現原理 http://www.cnblogs.com/paddix/p/5367116.html異步
Synchronized是Java中解決併發問題的一種最經常使用的方法,也是最簡單的一種方法。Synchronized的做用主要有三個:(1)確保線程互斥的訪問同步代碼(2)保證共享變量的修改可以及時可見(3)有效解決重排序問題。從語法上講,Synchronized總共有三種用法:ide
(1)修飾普通方法性能
(2)修飾靜態方法優化
(3)修飾代碼塊spa
每一個對象有一個監視器鎖(monitor)。當monitor被佔用時就會處於鎖定狀態,線程執行monitorenter指令時嘗試獲取monitor的全部權,過程以下:.net
一、若是monitor的進入數爲0,則該線程進入monitor,而後將進入數設置爲1,該線程即爲monitor的全部者。線程
二、若是線程已經佔有該monitor,只是從新進入,則進入monitor的進入數加1.
3.若是其餘線程已經佔用了monitor,則該線程進入阻塞狀態,直到monitor的進入數爲0,再從新嘗試獲取monitor的全部權。
執行monitorexit的線程必須是objectref所對應的monitor的全部者。
指令執行時,monitor的進入數減1,若是減1後進入數爲0,那線程退出monitor,再也不是這個monitor的全部者。其餘被這個monitor阻塞的線程能夠嘗試去獲取這個 monitor 的全部權。
所以 Synchronized的語義底層是經過一個monitor的對象來完成,其實wait/notify等方法也依賴於monitor對象,這就是爲何只有在同步的塊或者方法中才能調用wait/notify等方法,不然會拋出java.lang.IllegalMonitorStateException的異常的緣由。
輕量級鎖所適應的場景是線程交替執行同步塊的狀況,若是存在同一時間訪問同一鎖的狀況,就會致使輕量級鎖膨脹爲重量級鎖。
偏向鎖則是在只有一個線程執行同步塊時進一步提升性能。
http://www.cnblogs.com/paddix/p/5405678.html
http://www.cnblogs.com/paddix/p/5381958.html
http://www.cnblogs.com/paddix/p/5428507.html
說白了volatile修飾的變量,JVM保證了每次讀變量都從主內存中讀,而不是從主內存中copy到線程中到副本,不會由於兩份不一致致使,提供可見行。
當線程操做對volatile變量進行寫操做時,JMM會將該線程的本地內存中的副本變量刷新到主存中去;當線程對volatile變量進行讀操做時,線程先將本地內存共享變量設置爲無效,線程就會從主存中讀取共享變量的值了。
編譯器不會對volatile修飾的變量指令進行重排,保證順序一致性。
但它不能保證一致性
實現線程的方式:主要使用Runnable,Callable,Thread或者線程池。
class ThreeCallable implements Callable<Integer>{
public Integer call() throws Exception {
int i = 0;
for(;i<100;i++)
{
System.out.println(Thread.currentThread().getName()+" "+i);
}
return i;
}
}
ThreeCallable threeCallable = new ThreeCallable();
FutureTask<Integer> ft = new FutureTask<Integer>(threeCallable);
new Thread(ft).start();
System.err.println("ft:"+ft.get());
Runnable,Callable的區別?
實現方法名稱不同,Callable規定的方法是call(),Runnable規定的方法是run()。
Callable的任務執行後可返回值,而Runnable的任務是不能返回值得。
call()能夠拋出異常,run()不能夠。
運行Callable任務能夠拿到一個Future對象,表示異步計算的結果。它提供了檢查計算是否完成的方法,以等待計算的完成,並檢索計算的結果。經過Future對象能夠了解任務執行狀況,可取消任務的執行,還可獲取執行結果。