Synchronized是具有同步性與可見性的,那么什么是同步性與可見性呢?
(1)同步性:同步性就是一個事物要么一起成功,要么一起失敗,可謂是有福同享有難同當,就像A有10000去銀行轉5000給身無分文的B,這個事物有兩個操作,1.A扣去5000 即剩下10000-5000=5000;2.B增加0+5000=5000;一起成功的情況就是1和2都成功執行,一起失敗的情況是,如果A扣除的時候機器剛好壞了,那么事物就應該回滾,不然A就只剩5000,B還是0;這里沒寫例子
(2).可見性:就是一個線程的操作可以及時被其他線程更新到;要做到線程可見性必須滿足兩個條件,這里要談到JMM(java memory model),1.線程的工作內存副本的共享變量要更新到主存,2.其他線程要及時讀取主存的共享變量
為了更好理解 我截了個圖

以下代碼例子 是為了說明可見性的 是沒有增加Synchronized 關鍵字 所以運行結果會出現
result的值為0 或者 result的值為50
大家應該會疑問為什么會出現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 如果覺得有收獲就點擊 推薦,讓更多人快速學習,不懂也可以私信我免費交流
