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

Java?synchornized與ReentrantLock處理并發(fā)出現(xiàn)的錯誤

 更新時間:2023年01月05日 08:45:31   作者:欲無緣  
synchronized機制提供了對每個對象相關(guān)的隱式監(jiān)視器鎖,并強制所有鎖的獲取和釋放都必須在同一個塊結(jié)構(gòu)中。當(dāng)獲取了多個鎖時,必須以相反的順序釋放。即synchronized對于鎖的釋放是隱式的

什么是并發(fā)錯誤

多個線程共享操作同一個對象的時候,線程體當(dāng)中連續(xù)的多行操作未必能夠連續(xù)執(zhí)行 很可能操作只完成了一部分,時間片突然耗盡,此時,另一個線程搶到時間片,直接拿走并訪問了操作不完整的數(shù)據(jù)(操作不完整的數(shù)據(jù),從邏輯上講是錯誤數(shù)據(jù))。

并發(fā)錯誤是如何產(chǎn)生的

根本原因: 多個線程共享操作同一份數(shù)據(jù)

直接原因: 線程體當(dāng)中連續(xù)的多行語句,未必能夠連續(xù)執(zhí)行,很可能操作只完成了一半 時間片突然耗盡。

此時另一個線程剛好搶到時間片,直接拿走了操作不完整的數(shù)據(jù) - 錯誤數(shù)據(jù)。

導(dǎo)火索: 時間片突然耗盡

演示并發(fā)錯誤

public class TestConcurrentError{
	public static void main(String[] args){
		Student stu = new Student("張朝偉","先生");
		PrintThread pt = new PrintThread(stu);
		ChangeThread ct = new ChangeThread(stu);
		pt.start();
		ct.start();
	}
}
class PrintThread extends Thread{
	Student stu;
	public PrintThread(Student stu){
		this.stu = stu;
	}
	@Override
	public void run(){
		while(true){
			System.out.println(stu);
		}
	}
}
class ChangeThread extends Thread{
	Student stu;
	public ChangeThread(Student stu){
		this.stu = stu;
	}
	@Override
	public void run(){
		boolean isOkay = true;
		while(true){
				if(isOkay){ 
					stu.name = "張曼玉";
					stu.gender = "女士";
				}else{ 
					stu.name = "梁朝偉";
					stu.gender = "先生";
				}
				isOkay = !isOkay;
		}
	}
}
class Student{
	String name;
	String gender;//性別
	public Student(String name,String gender){
		this.name = name;
		this.gender = gender;
	}
	@Override
	public String toString(){
		return name + " : " + gender;
	}
}

我們看運行結(jié)果發(fā)現(xiàn)一個非常嚴(yán)重的問題

我們的代碼從來沒有寫過將梁朝偉賦值為女士,也沒有寫過將張曼玉賦值為女士我們的程序為什么會出現(xiàn)這樣的情況 ?

線程體當(dāng)中連續(xù)的多行操作未必能夠連續(xù)執(zhí)行 假如我們將stu的名字賦值為梁朝偉,此時CPU時間片耗盡了,另一個打印的線程搶到時間片的情況下 就會將原來的正確的值改為錯誤的數(shù)據(jù) 從而產(chǎn)生并發(fā)錯誤。

如何解決并發(fā)錯誤

要想解決并發(fā)錯誤加鎖是必須的

使用synchornized解決并發(fā)錯誤

synchronize語法級別的加鎖 也叫? 互斥鎖=互斥標(biāo)記=鎖標(biāo)記=鎖旗標(biāo)=監(jiān)視器= Monitor

synchornized修飾代碼塊

synchronized(臨界資源){
	//需要連續(xù)執(zhí)行的操作
}

synchornized修飾整個方法

public synchronized void add(){
}
//等價于
public void add(){
	synchronized(){
	}
}

注意:即便synchronized加在方法上,其實還是對對象進行加鎖,而且鎖的是調(diào)用方法的那個對象Java世界里只有每個對象才有鎖標(biāo)記,所以加鎖只能對對象加鎖。

public class TestConcurrentError{
	public static void main(String[] args){
		Student stu = new Student("張朝偉","先生");
		PrintThread pt = new PrintThread(stu);
		ChangeThread ct = new ChangeThread(stu);
		pt.start();
		ct.start();
	}
}
//1st.用于打印顯示數(shù)據(jù)的線程 
class PrintThread extends Thread{
	Student stu;
	public PrintThread(Student stu){
		this.stu = stu;
	}
	@Override
	public void run(){
		while(true){
			synchronized(stu){//我們要對一組連續(xù)的操作加鎖 不要對所有操作加鎖
							  //我們?nèi)?只是鎖一次上廁所的過程 不要一輩子死在廁所里
				System.out.println(stu);
			}
		}
	}
}
class ChangeThread extends Thread{
	Student stu;
	public ChangeThread(Student stu){
		this.stu = stu;
	}
	@Override
	public void run(){
		boolean isOkay = true;
		while(true){
			synchronized(stu){
				if(isOkay){ 
					stu.name = "張曼玉";
					stu.gender = "女士";
				}else{ 
					stu.name = "梁朝偉";
					stu.gender = "先生";
				}
				isOkay = !isOkay;
			}
		}
	}
}
class Student{
	String name;
	String gender;
	public Student(String name,String gender){
		this.name = name;
		this.gender = gender;
	}
	@Override
	public String toString(){
		return name + " : " + gender;
	}
}

使用ReentrantLock解決并發(fā)錯誤

java.util.concurrent.locks.ReentrantLock(jdk 5.0開始):java包的工具包的并發(fā)包的 可重入鎖

ReentrantLock :lock(加鎖) unlock(解鎖):放在finally{}中

ReentrantLock可以在構(gòu)造方法中傳公平鎖和非公平鎖(公平與否針對第一個先來的線程而言)

公平鎖:new Reetrantlock(true);

  • JDK6.0之前這個Lock的機制比synchronized效率高很多 JDK6.0開始
  • 重新對synchronized修改了底層實現(xiàn),加入了一堆新的概念 (偏向鎖 輕量級鎖 鎖的自旋機制) 從JDK6.0開始 synchronized 跟 Lock性能上不相上下
import java.util.concurrent.locks.*;
public class TestConcurrentErrorWithLock{
	public static void main(String[] args){
		Lock lock = new ReentrantLock();
		Student stu = new Student("張朝偉","先生");
		PrintThread pt = new PrintThread(stu,lock);
		ChangeThread ct = new ChangeThread(stu,lock);
		pt.start();
		ct.start();
	}
}
//1st.用于打印顯示數(shù)據(jù)的線程
class PrintThread extends Thread{
	Student stu;
	Lock lock;
	public PrintThread(Student stu,Lock lock){
		this.stu = stu;
		this.lock = lock;
	}
	@Override
	public void run(){
		while(true){
			lock.lock();//鎖 既是一個名詞 又是一個動詞
			try{
			//synchronized(stu){//我們要對一組連續(xù)的操作加鎖 不要對所有操作加鎖
							  //我們?nèi)?只是鎖一次上廁所的過程 不要一輩子死在廁所里
				System.out.println(stu);
			//}
			}finally{
				lock.unlock();
			}
		}
	}
}
class ChangeThread extends Thread{
	Student stu;
	Lock lock;
	public ChangeThread(Student stu,Lock lock){
		this.stu = stu;
		this.lock = lock;
	}
	@Override
	public void run(){
		boolean isOkay = true;
		while(true){
			//synchronized(stu){
				lock.lock();
				try{
					if(isOkay){ 
						stu.name = "張曼玉";
						stu.gender = "女士";
					}else{ 
						stu.name = "梁朝偉";
						stu.gender = "先生";
					}
					isOkay = !isOkay;
				}finally{
					lock.unlock();
				}
			//}
		}
	}
}
class Student{
	String name;
	String gender;//性別
	public Student(String name,String gender){
		this.name = name;
		this.gender = gender;
	}
	@Override
	public String toString(){
		return name + " : " + gender;
	}
}

此時已經(jīng)解決了并發(fā)錯誤

到此這篇關(guān)于Java synchornized與ReentrantLock處理并發(fā)出現(xiàn)的錯誤的文章就介紹到這了,更多相關(guān)Java synchornized與ReentrantLock內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot實現(xiàn)application.yml文件敏感信息加密

    SpringBoot實現(xiàn)application.yml文件敏感信息加密

    本文主要介紹了SpringBoot實現(xiàn)application.yml文件敏感信息加密,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • java編寫猜數(shù)字游戲

    java編寫猜數(shù)字游戲

    這篇文章主要為大家詳細介紹了java編寫猜數(shù)字游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • SpringBoot多環(huán)境打包與配置文件排除實踐記錄

    SpringBoot多環(huán)境打包與配置文件排除實踐記錄

    本文介紹了SpringBoot項目多環(huán)境打包與配置文件排除實踐,包括多環(huán)境配置的實現(xiàn)方法、打包時排除配置文件的方法以及動態(tài)加載外部配置文件的最佳實踐,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • Java?超詳細講解設(shè)計模式之中的建造者模式

    Java?超詳細講解設(shè)計模式之中的建造者模式

    建造者模式,是一種對象構(gòu)建模式 它可以將復(fù)雜對象的建造過程抽象出來,使這個抽象過程的不同實現(xiàn)方法可以構(gòu)造出不同表現(xiàn)的對象。本文將通過示例講解建造者模式,需要的可以參考一下
    2022-03-03
  • java中常用工具類之字符串操作類和MD5加密解密類

    java中常用工具類之字符串操作類和MD5加密解密類

    這篇文章主要介紹了java中常用工具類之字符串操作類和MD5加密解密類,需要的朋友可以參考下
    2014-07-07
  • Java中 % 與Math.floorMod() 區(qū)別詳解

    Java中 % 與Math.floorMod() 區(qū)別詳解

    這篇文章主要介紹了Java中 % 與Math.floorMod() 區(qū)別詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Java源碼解析之詳解ReentrantLock

    Java源碼解析之詳解ReentrantLock

    今天給大家?guī)淼氖顷P(guān)于Java并發(fā)的相關(guān)知識,文章圍繞著ReentrantLock源碼展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • java中對象的序列化與反序列化深入講解

    java中對象的序列化與反序列化深入講解

    這篇文章主要給大家介紹了關(guān)于java中對象的序列化與反序列化的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • Spring啟動時實現(xiàn)初始化的幾種方案

    Spring啟動時實現(xiàn)初始化的幾種方案

    這篇文章主要介紹了Spring啟動時實現(xiàn)初始化的幾種方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • SpringBoot攔截器使用精講

    SpringBoot攔截器使用精講

    攔截器可以根據(jù) URL 對請求進行攔截,主要應(yīng)用于登陸校驗、權(quán)限驗證、亂碼解決、性能監(jiān)控和異常處理等功能上。SpringBoot同樣提供了攔截器功能。 本文將為大家詳細介紹一下
    2021-12-12

最新評論

油尖旺区| 澄迈县| 平远县| 永靖县| 东乡县| 巍山| 沙田区| 兴宁市| 梅河口市| 荥阳市| 格尔木市| 淮北市| 青州市| 许昌县| 汉川市| 南开区| 黄浦区| 万载县| 抚州市| 津市市| 靖宇县| 灌南县| 栾城县| 扶绥县| 修文县| 娱乐| 黔西| 乃东县| 德昌县| 永平县| 监利县| 彭州市| 德州市| 綦江县| 弋阳县| 永和县| 平山县| 绥宁县| 商南县| 红桥区| 壤塘县|