最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java 詳細講解線程安全與同步附實例與注釋

 更新時間:2022年04月14日 10:11:05   作者:湯鍵.TJ  
線程安全是多線程編程時的計算機程序代碼中的一個概念。在擁有共享數(shù)據(jù)的多條線程并行執(zhí)行的程序中,線程安全的代碼會通過同步機制保證各個線程都可以正常且正確的執(zhí)行,不會出現(xiàn)數(shù)據(jù)污染等意外情況

線程安全問題

多個線程可能會共享(訪問)同一個資源

比如訪問同一個對象,同一個變量,同一個文件

當多個線程訪問同一塊資源時,很容易引發(fā)數(shù)據(jù)錯亂和數(shù)據(jù)安全問題,稱為線程安全問題

什么情況下會出現(xiàn)線程安全問題

多個線程共享同一個資源

且至少有一個線程正在執(zhí)行寫的操作

實例:

存錢取錢問題

分別有存錢和取錢2個線程

   存錢                      取錢
   線程1         余額         線程2
   1000  《----1000------》 1000
   1000+1000-----》2000
                500 《-----1000-500

正確:結束后余額應該是1500,而不是500

買票問題

有賣票2個線程

   賣票                      賣票
   線程1         票數(shù)         線程2
   1000  《----1000------》 1000
   1000-1-----》999
                999 《-----1000-1

正確:結束后余額應該是998,而不是999

買票問題錯誤(未線程同步)實例:

public class love implements Runnable{
    private int piao=3000;//有3000張票
    public boolean sale() {//ture代表還有票;false代表沒有票了
        if(piao<1) return false;
         piao--;//賣1張票
         
         //細化piao--;
         //寄存器=piao;
         //寄存器=寄存器-1;
         //piao=寄存器;
         
         String sk =Thread.currentThread().getName();//獲取當前線程(買票窗口)的名字
         System.out.println(sk+"賣了1張票,還剩下"+piao+"張");
         return piao>1;
    }
    public void run() {
         while(sale());//循環(huán)執(zhí)行;直至賣完票返回false
    }
}
 
public class Main {
    public static void main(String[] a) {
        love tjlove =new love();
        for(int i=1;i<=4;i++) {//循環(huán)4次;產(chǎn)生4個線程(窗口)賣票
            Thread tj = new Thread(tjlove());
            tj.setName(""+i);
            tj.start();
        }
    }
}

部分輸出結果:

線程安全問題

分析問題

線程A和B對類中1個變量值為17進行+1操作
最終結果為2個18

解決方案

加鎖:

過程:首先線程A先訪問到這個17,讀上來后進行加鎖并進去+1的操作改為18
并且17在加鎖期間其它線程都不能訪問
改完之后再進行寫入,然后再解鎖17
然后再由線程B去訪問它,再進行加鎖,重復上面操作變成19再解鎖
這樣做能保證在同一時間只有1個線程去訪問它,這樣就保證了安全;之前錯誤是由于這些線程一起去訪問了它

線程同步

剛剛所說的加鎖操作便是線程同步技術

可以使用線程同步技術來解決線程安全問題

線程同步在Java里有2種做法:

1.同步語句

2.同步方法

同步語句

public class love implements Runnable{
	private int piao=3000;//本人cpu單核性能過強,數(shù)據(jù)量大些才能看到是4個線程在賣票
	public boolean sale() {
		synchronized(this) {//1個線程獲取這個對象的鎖,并加鎖;    synchronized作用于整個語句
		//this指向當前對象
		//不能用new Object();這樣會產(chǎn)生新的對象,產(chǎn)生新的鎖
		//把this換成"123",效果基本一樣;因為其存在常量值里,每次訪問的對象一樣
			if(piao<1) return false;
			piao--;
			String sk =Thread.currentThread().getName();
			System.out.println(sk+"賣了1張票,還剩下"+piao+"張");
			return piao>0;
			}
	}
	public void run() {
		 while(sale());
	}
}

部分輸出結果:

synchronize(obj)的原理

1.每個對象都有一個與它相關的內(nèi)部鎖(intrinsic lock)或者叫監(jiān)視器鎖(monitor lock)

2.第一個執(zhí)行到同步語句的線程可以獲得 obj 的內(nèi)部鎖,在執(zhí)行完同步語句中的代碼后釋放此鎖

3.只要一個線程持有了內(nèi)部鎖,那么其它線程在同一時刻將無法再獲得此鎖

? 當它們試圖獲取此鎖時,將會進入BLOCKED狀態(tài)

4.多個線程訪問同一個 synchronized(obj)語句時

obj必須是同一個對象,才能起到同步的作用

同步方法

public class love implements Runnable{
    private int piao=3000;
    public synchronized boolean sale() { //synchronized作用于整個方法
            if(piao<1) return false;
            piao--;
            String sk =Thread.currentThread().getName();
            System.out.println(sk+"賣了1張票,還剩下"+piao+"張");
            return piao>0;
    }
    public void run() {
         while(sale());
    }
}

synchronized不能修飾構造方法

同步方法的本質

實例方法:synchronized (this)

靜態(tài)方法:synchronized (Class對象)

同步語句比同步方法更靈活一點

同步語句可以精確控制需要加鎖的代碼范圍,減少處于BLOCKED狀態(tài)的線程,充分利用勞動力

使用了線程同步技術后

雖然解決了線程安全問題,但是降低了程序的執(zhí)行效率

因為加了鎖就會有處于等待的線程,多了加鎖解鎖的操作

所以在真正有必要的時候,才使用線程同步技術

到此這篇關于Java 詳細講解線程安全與同步附實例與注釋的文章就介紹到這了,更多相關Java 線程安全內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java測試題 實現(xiàn)一個注冊功能過程解析

    Java測試題 實現(xiàn)一個注冊功能過程解析

    這篇文章主要介紹了Java測試題 實現(xiàn)一個注冊功能過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • 使用Vue+Spring Boot實現(xiàn)Excel上傳功能

    使用Vue+Spring Boot實現(xiàn)Excel上傳功能

    這篇文章主要介紹了使用Vue+Spring Boot實現(xiàn)Excel上傳,需要的朋友可以參考下
    2018-11-11
  • 基于Java8 函數(shù)式接口理解及測試

    基于Java8 函數(shù)式接口理解及測試

    下面小編就為大家?guī)硪黄贘ava8 函數(shù)式接口理解及測試。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • Java語言之包和繼承詳解

    Java語言之包和繼承詳解

    這篇文章主要介紹了java的包和繼承,結合實例形式詳細分析了Java繼承的概念、原理、用法及相關操作注意事項,需要的朋友可以參考下
    2021-09-09
  • springboot的EnvironmentPostProcessor接口方法源碼解析

    springboot的EnvironmentPostProcessor接口方法源碼解析

    這篇文章主要介紹了springboot的EnvironmentPostProcessor接口方法源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • springboot整合mybatis中的問題及出現(xiàn)的一些問題小結

    springboot整合mybatis中的問題及出現(xiàn)的一些問題小結

    這篇文章主要介紹了springboot整合mybatis中的問題及出現(xiàn)的一些問題小結,本文給出了解決方案,需要的朋友可以參考下
    2018-11-11
  • java 將方法作為傳參--多態(tài)的實例

    java 將方法作為傳參--多態(tài)的實例

    下面小編就為大家?guī)硪黄猨ava 將方法作為傳參--多態(tài)的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • java String類功能、原理與應用案例【統(tǒng)計、判斷、轉換等】

    java String類功能、原理與應用案例【統(tǒng)計、判斷、轉換等】

    這篇文章主要介紹了java String類功能、原理與應用案例,結合實例形式詳細分析了java String類的基本功能、構造方法,以及使用String類實現(xiàn)統(tǒng)計、判斷、轉換等功能相關操作技巧,需要的朋友可以參考下
    2019-03-03
  • Java基礎之反射

    Java基礎之反射

    JAVA反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意一個方法和屬性;反射是框架設計的靈魂,感興趣的小伙伴可以參考閱讀
    2023-03-03
  • 優(yōu)化常見的java排序算法

    優(yōu)化常見的java排序算法

    這篇文章主要介紹了Java編程中快速排序算法的實現(xiàn)及相關算法優(yōu)化,快速排序算法的最差時間復雜度為(n^2),最優(yōu)時間復雜度為(n\log n),存在優(yōu)化的空間,需要的朋友可以參考下
    2021-07-07

最新評論

饶平县| 正蓝旗| 新宁县| 张家界市| 青浦区| 中西区| 盘锦市| 福鼎市| 东方市| 盐山县| 三河市| 土默特右旗| 织金县| 西昌市| 眉山市| 化州市| 长顺县| 平邑县| 浦城县| 林西县| 美姑县| 江西省| 东乡| 昂仁县| 德州市| 仲巴县| 浦江县| 万山特区| 鄂伦春自治旗| 清涧县| 南皮县| 嘉兴市| 盐池县| 晋江市| 东安县| 泾阳县| 井陉县| 临江市| 开化县| 浦北县| 历史|