導航:首頁 > 編程語言 > java實現線程的同步

java實現線程的同步

發布時間:2022-03-09 13:20:41

java多線程有幾種實現方法線程之間如何同步

Java多線程有兩種實現方式:一種是繼承Thread類,另一種是實現Runable介面,大同小異,推薦後者,因為實現介面的話這個類還可以實現別的介面和繼承一個類,靈活性好,若繼承Thread類之後,就無法繼承其他類了。
至於實現同步,最簡單的方法就是使用同步塊,synchronized(){語句塊}
當多個線程同時訪問到同步語句塊時,會由一個線程先獲得對象鎖,獲取對象鎖的線程執行完畢之後,釋放鎖,其他線程再次競爭鎖,一個一個通過,不存在兩個以上線程同時執行同步語句塊的情況。

② Java如何實現多線程同步

//解決方案-1 設置3把鎖, 然後把鎖們應用到所有線程中 (涉及到synchronized wait notify等, 嫌麻煩. 略)
解決方案-2 設置3個全局共享的信號標記(信號燈) + 3子線程分別佔用標記1 2 3
+ 主線程輪詢/等待
(簡潔明快 推薦)

//解決方案-2 實現如下:
static boolean t1_done = false;
static boolean t2_done = false;
static boolean t3_done = false;

//t1------run() { ............ ; t1_done = true; }
//t2、 3: 同理,略

main () { .............;
啟動t1;
啟動t2;
啟動t3;

//輪詢 or 等待
while ( true )
if ( t1_done && t2_done && t3_done) break;
else
Thread.yield () ;
// 或 Thread.sleep(xxxx) ----若子線程運行超過100ms以上,應予考慮

//輪詢結束,主線程繼續工作
} //main END

have fun

③ java (線程的同步與並發)

試試我改過的這個

class Mystack
{
int index=0;
private char[]date=new char [10];

public void push(char c)
{
synchronized(this)
{
if(index<10)
{
date[index]=c;
index++;
if(index==10)
notify();
}

else
{

try
{
System.out.println ("push wait");
wait();

}
catch(Exception e)
{
e.printStackTrace();
System.err.println(e);
}

}

}

}

public void pop()
{
synchronized(this)
{
if(index!=0)
{
if(index>9)
index--;
System.out.print ("B:pop");
System.out.println (date[index]);
index--;
if(index==0)
notify();

}
else
{
try
{
System.out.println ("pop wait");
wait();

}
catch(Exception e)
{
e.printStackTrace();
System.err.println (e);
}

}

}

}
}

class PushChar extends Thread
{
Mystack s;
char c;

PushChar(Mystack s)
{
this.s=s;
}

public void run()
{
System.out.println ("start push");
for (int i=0; i<20; i++)
{
c=(char)(Math.random()*26+'A');
s.push(c);

System.out.println("A:push "+c);

}
}

}
class PopChar extends Thread
{
Mystack s;
char c;

PopChar(Mystack s)
{
this.s=s;
}

public void run()
{
System.out.println ("start pop");
for(int j=0;j<20;j++)

s.pop();
}
}

public class Test
{
public static void main (String[] args)
{
Mystack s=new Mystack();
PushChar a=new PushChar(s);
PopChar b=new PopChar(s);
a.start();
b.start();
}
}

④ Java實現線程同步的幾種方式

java中多線程的實現方法有兩種:1.直接繼承thread類;2.實現runnable介面;同步的實現方法有五種:1.同步方法;2.同步代碼塊;3.使用特殊域變數(volatile)實現線程同步;4.使用重入鎖實現線程同步;5.使用局部變數實現線程同步 。
其中多線程實現過程中需注意重寫或者覆蓋run()方法,而對於同步的實現方法中使用較常使用的是利用synchronized編寫同步方法和代碼塊。

⑤ java採用什麼機制實現多線程同步

thread(線程)、thread-safe(線程安全)、intercurrent(並發的)
synchronized(同步的)、asynchronized(非同步的)、
volatile(易變的)、atomic(原子的)、share(共享)

⑥ JAVA 多線程同步概念

加入一個程序里的一個方法有以下輸出,這兩個輸出需要一起執行:
println("第"+i+"個線程連接");
println("你好啊,"+i+"號");
然後有兩個線程連調用了這個方法,分別叫他們1和2線程
本來我想要的輸出應該是:
第1個線程連接
你好啊,1號
第2個線程連接
你好啊,2號
但是如果不加同步的話,極有可能導致如下輸出:
第1個線程連接
第2個線程連接
你好啊,2號
你好啊,1號
這顯然不是我想要的。

再比如銀行系統,個人賬戶的存、取操作也應該是同步的
如果我的余額是10元,我想在線買一個15元的東西,我的余額不足,於是我充值5元,再消費15元。由於操作的目標都是余額屬性,所以多線程不同步的情況下,極有可能是先執行了消費操作後執行存錢操作。這種情況下我的余額是不足的,導致操作不成功。但事實是,在他判定我余額的後一秒鍾存錢動作執行了,其實我的余額是夠的。這就導致了一個錯誤。

同步鎖只是保證執行順序,而不是說這一個方法大家在排隊

⑦ Java 線程同步幾種方式

(1)同步方法:
即有synchronized關鍵字修飾的方法。 由於java的每個對象都有一個內置鎖,當用此關鍵字修飾方法時,內置鎖會保護整個方法。在調用該方法前,需要獲得內置鎖,否則就處於阻塞狀態。
(2)同步代碼塊
即有synchronized關鍵字修飾的語句塊。被該關鍵字修飾的語句塊會自動被加上內置鎖,從而實現同步
(3)使用特殊域變數(Volatile)實現線程同步
a.volatile關鍵字為域變數的訪問提供了一種免鎖機制
b.使用volatile修飾域相當於告訴虛擬機該域可能會被其他線程更新
c.因此每次使用該域就要重新計算,而不是使用寄存器中的值
d.volatile不會提供任何原子操作,它也不能用來修飾final類型的變數
(4)使用重入鎖實現線程同步
在JavaSE5.0中新增了一個java.util.concurrent包來支持同步。ReentrantLock類是可重入、互斥、實現了Lock介面的鎖, 它與使用synchronized方法和快具有相同的基本行為和語義,並且擴展了其能力。
(5)使用局部變數實現線程同步

⑧ 請問java怎麼實現兩個線程同步

靠,你這能叫同步嗎,你還敢這邊沒寫完那邊就開始壓縮啊。學東西都學死了,在多線程下去連死活都能並發了,一邊死一邊復活。

⑨ Java多線程同步同步代碼塊

票數弄多一些,休眠時間長一點,效果會好一些。

閱讀全文

與java實現線程的同步相關的資料

熱點內容
優信二手車解壓後過戶 瀏覽:62
Windows常用c編譯器 瀏覽:778
關於改善國家網路安全的行政命令 瀏覽:833
安卓如何下載網易荒野pc服 瀏覽:654
javainetaddress 瀏覽:104
蘋果4s固件下載完了怎麼解壓 瀏覽:1003
命令zpa 瀏覽:286
python編譯器小程序 瀏覽:945
在app上看視頻怎麼光線調暗 瀏覽:540
可以中文解壓的解壓軟體 瀏覽:593
安卓卸載組件應用怎麼安裝 瀏覽:913
使用面向對象編程的方式 瀏覽:339
程序員項目經理的年終總結範文 瀏覽:929
內衣的加密設計用來幹嘛的 瀏覽:433
淮安數據加密 瀏覽:292
魔高一丈指標源碼 瀏覽:982
松下php研究所 瀏覽:168
c回調java 瀏覽:401
夢幻端游長安地圖互通源碼 瀏覽:746
電腦本地文件如何上傳伺服器 瀏覽:313