Java中線程用法總結(jié)
本文實例總結(jié)了Java中線程用法。分享給大家供大家參考。具體分析如下:
1.線程是基本調(diào)度單元。共享進程的資源,如內(nèi)存和文件句柄。但有自己的pc(程序計數(shù)器),stack(線程棧)及本地變量
2.線程的優(yōu)勢:
a) 充分利用多處理器
b) 可以簡化模型。特定任務(wù)給特定線程。如servlets及rmi等框架。
c) 對異步事件的簡單處理。如socket,nio使用更復雜。而現(xiàn)在的操作系統(tǒng)支持更大數(shù)量的線程。
d) 界面的更佳響應
3.內(nèi)部鎖:synchronized塊。互斥??芍厝耄╮eentrancy),這樣的設(shè)計可以避免死鎖
4.內(nèi)存可見性:因為編譯器的優(yōu)化,線程并不和你看到的一樣。
public class NoVisibility {
private static boolean ready;
private static int number;
private static class ReaderThread extends Thread {
public void run() {
while (!ready)
Thread.yield();
System.out.println(number);
}
}
public static void main(String[] args) {
new ReaderThread().start();
number = 42;
ready=true;
}
}
可能打印0,或者一直循環(huán)。因為重排序了
5.volatile:可以解決內(nèi)存可見性,對syncronized性能更佳,但僅此而已,如不能保證a++的原子性
6.溢出(escape):不要在構(gòu)造函數(shù)中將this指針溢出。不要將內(nèi)部變量溢出,如:
class Test {
private String[] list = new String[] {};
public String[] getList() {return list;}
}
7.線程封閉:把對象封閉在一個線程中,無論對象是否是線程安全的,都能保證線程安全
a) statck限制。即只有本地變量能訪問該對象。
b)ThreadLocal。
8.不可變對象。一定是線程安全的。不可變對象必須滿足:
a) 狀態(tài)不能在創(chuàng)建后修改。
b) 所以的域都是final
c) 正確創(chuàng)建對象,沒有this指針溢出
9.安全發(fā)布
a) 通過static初始化對象
b) 使用volatile或AtomicReference
c) 將引用存儲于正確創(chuàng)建的對象的final域
d) 使用鎖
希望本文所述對大家的java程序設(shè)計有所幫助。
相關(guān)文章
IDEA集成DeepSeek通過離線安裝解決無法安裝Proxy?AI插件問題(最新推薦)
許多開發(fā)者嘗試通過安裝Proxy?AI等插件將AI能力引入IDEA,但在實際使用中常遭遇插件安裝失敗、網(wǎng)絡(luò)連接不穩(wěn)定或兼容性沖突等問題,本文給大家介紹IDEA集成DeepSeek通過離線安裝解決無法安裝Proxy?AI插件問題,感興趣的朋友一起看看吧2019-12-12
springboot創(chuàng)建多module項目的實例
這篇文章主要介紹了springboot創(chuàng)建多module項目的實例代碼,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
聊聊SpringCloud中的Ribbon進行服務(wù)調(diào)用的問題
SpringCloud-Ribbon是基于Netflix?Ribbon實現(xiàn)的一套客戶端負載均衡的工具。本文給大家介紹SpringCloud中的Ribbon進行服務(wù)調(diào)用的問題,感興趣的朋友跟隨小編一起看看吧2022-01-01

