Synchronized同步性與可見性

 

Synchronized是具備同步性與可見性的,那麼什麼是同步性與可見性呢?java

(1)同步性:同步性就是一個事物要麼一塊兒成功,要麼一塊兒失敗,可謂是有福同享有難同當,就像A有10000去銀行轉5000給身無分文的B,這個事物有兩個操做,1.A扣去5000 即剩下10000-5000=5000;2.B增長0+5000=5000;一塊兒成功的狀況就是1和2都成功執行,一塊兒失敗的狀況是,若是A扣除的時候機器恰好壞了,那麼事物就應該回滾,否則A就只剩5000,B仍是0;這裏沒寫例子ide

(2).可見性:就是一個線程的操做能夠及時被其餘線程更新到;要作到線程可見性必須知足兩個條件,這裏要談到JMM(java memory model),1.線程的工做內存副本的共享變量要更新到主存,2.其餘線程要及時讀取主存的共享變量學習

爲了更好理解 我截了個圖 this

 

如下代碼例子 是爲了說明可見性的 是沒有增長Synchronized 關鍵字  因此運行結果會出現 線程

result的值爲0 或者 result的值爲50blog

你們應該會疑問爲何會出現50? 這是否是表明沒有加Synchronized  也能夠實現可見性 ,其實沒有加Synchronized 並不表明就必定不會出現可見性,只是機率事件事件

package cs.util;

public class SynchronizedDemo {
private boolean start=false;
private int result=0;
private int count=0;

//讀操做
public void write()
{
start=true;
count=10;

}

//寫操做
public void read()
{
if(start)
{
result=count*5;
}
System.out.println("result的值爲"+result);
}
class ReadWriteThread extends Thread
{
private boolean state=false;

public ReadWriteThread(boolean state)
{
this.state=state;
}
@Override
public void run() {
// TODO Auto-generated method stub
if(state)
{
write();
}
else
{
read();
}
}
}
public static void main(String[] args) {
SynchronizedDemo demo=new SynchronizedDemo();
demo.new ReadWriteThread(true).start();
demo.new ReadWriteThread(false).start();

}
}

 若是要每次都實現 result的值爲50 怎麼辦呢?  很簡單 就修改兩處地方內存

//讀操做
public  synchronized void write()
{
start=true;
count=10;

}

//寫操做
public synchronized void read()
{
if(start)
{
result=count*5;
}

這隻保證了可見性,咱們還要保證先寫後讀 還要改一個就是同步

public static void main(String[] args) {
		SynchronizedDemo demo=new  SynchronizedDemo();
		
		demo.new ReadWriteThread(true ).start();
		
		try {
			Thread.sleep(100);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//休眠一下,不要讓下面的讀操做太快執行
		demo.new ReadWriteThread(false).start();
		
		}

  

那麼每次運行結果都會輸出 result的值爲50   若是以爲有收穫就點擊 推薦,讓更多人快速學習,不懂也能夠私信我免費交流it

相關文章
相關標籤/搜索