欧美亚洲中文,在线国自产视频,欧洲一区在线观看视频,亚洲综合中文字幕在线观看

      1. <dfn id="rfwes"></dfn>
          <object id="rfwes"></object>
        1. 站長(zhǎng)資訊網(wǎng)
          最全最豐富的資訊網(wǎng)站

          Java介紹八鎖問題帶你徹底理解對(duì)象鎖和類鎖

          Java介紹八鎖問題帶你徹底理解對(duì)象鎖和類鎖

          相關(guān)免費(fèi)學(xué)習(xí)推薦:java基礎(chǔ)教程

          8鎖問題演示

          1.標(biāo)準(zhǔn)訪問

          /*手機(jī)類可以發(fā)郵件和發(fā)短信*/class Phone{ 	public synchronized void sendEmail() throws Exception{ 		System.out.println("***sendEmail"); 	} 	public synchronized void sendSMS() throws Exception{ 		System.out.println("***sendSMS"); 	}}public class Lock8Demo { 	public static void main(String[] args) throws InterruptedException { 		//創(chuàng)建一個(gè)資源類 		Phone phone=new Phone(); 		new Thread(()->{ 			try { 				phone.sendEmail(); 			} catch (Exception e) { 				// TODO Auto-generated catch block 				e.printStackTrace(); 			} 		},"A").start(); 		Thread.sleep(100); 		new Thread(()->{ 			try { 				phone.sendSMS(); 			} catch (Exception e) { 				// TODO Auto-generated catch block 				e.printStackTrace(); 			} 		},"B").start(); 	}}

          Java介紹八鎖問題帶你徹底理解對(duì)象鎖和類鎖
          標(biāo)準(zhǔn)訪問,先打印郵件還是短信.
          不一定誰(shuí)先被打印。取決于CPU的執(zhí)行情況.激活他們的是main線程,后面誰(shuí)先被調(diào)度,不知道。
          為了保證效果,我們?cè)贏和B的代碼之間加thread.sleep(100).此時(shí),可以確保A先被打印。
          解釋:
          只要一個(gè)資源類里面,不管它有多少個(gè)同步方法,只要一個(gè)線程先訪問了資源類里面的任何一個(gè)同步方法,那么它鎖的不是這一個(gè)方法,鎖的是該方法所在的整個(gè)資源類。也就是說,鎖的是對(duì)象。它鎖的不是當(dāng)前的方法。
          也就是說,這些synchoronized的方法都屬于同一個(gè)資源類里面,鎖的是整個(gè)資源類。

          2.在郵件方法中暫停4秒,請(qǐng)問先打印郵件還是短信

          /*手機(jī)類可以發(fā)郵件和發(fā)短信*/class Phone{ 	public synchronized void sendEmail() throws Exception{ 		TimeUnit.SECONDS.sleep(4);		//表示暫停4秒,它是一個(gè)枚舉類型 		System.out.println("***sendEmail"); 	} 	public synchronized void sendSMS() throws Exception{ 		System.out.println("***sendSMS"); 	}}public class Lock8Demo { 	public static void main(String[] args) throws InterruptedException { 		//創(chuàng)建一個(gè)資源類 		Phone phone=new Phone(); 		new Thread(()->{ 			try { 				phone.sendEmail(); 			} catch (Exception e) { 				// TODO Auto-generated catch block 				e.printStackTrace(); 			} 		},"A").start(); 		Thread.sleep(100); 		new Thread(()->{ 			try { 				phone.sendSMS(); 			} catch (Exception e) { 				// TODO Auto-generated catch block 				e.printStackTrace(); 			} 		},"B").start(); 	}}

          先打印郵件。同步方法獲取的phone對(duì)象鎖,sleep不會(huì)釋放鎖。到了時(shí)間會(huì)立即執(zhí)行。所以先打印郵件方法
          解釋:
          它與問題1類似。
          只要一個(gè)資源類里面,不管它有多少個(gè)同步方法,只要一個(gè)線程先訪問了資源類里面的任何一個(gè)同步方法,那么它鎖的不是這一個(gè)方法,鎖的是該方法所在的整個(gè)資源類。也就是說,鎖的是對(duì)象。它鎖的不是當(dāng)前的方法。
          舉個(gè)例子:我和班長(zhǎng)要用同一個(gè)手機(jī)打電話,我肯定要等班長(zhǎng)打完電話才能接著打。班長(zhǎng)用的過程中停網(wǎng)了一段時(shí)間,那我也只能等班長(zhǎng)打完。

          3.新增普通sayHello方法,請(qǐng)問先打印郵件還是hello

          先打印hello

          /*手機(jī)類可以發(fā)郵件和發(fā)短信*/class Phone{ 	public synchronized void sendEmail() throws Exception{ 		TimeUnit.SECONDS.sleep(4);		//表示暫停4秒,它是一個(gè)枚舉類型 		System.out.println("***sendEmail"); 	} 	public synchronized void sendSMS() throws Exception{ 		System.out.println("***sendSMS"); 	} 	public void sayHello(){ 		System.out.println("***sayHello"); 	}}public class Lock8Demo { 	public static void main(String[] args) throws InterruptedException { 		//創(chuàng)建一個(gè)資源類 		Phone phone=new Phone(); 		new Thread(()->{ 			try { 				phone.sendEmail(); 			} catch (Exception e) { 				// TODO Auto-generated catch block 				e.printStackTrace(); 			} 		},"A").start(); 		Thread.sleep(100); 		new Thread(()->{ 			try { 				//phone.sendSMS(); 				phone.sayHello(); 			} catch (Exception e) { 				// TODO Auto-generated catch block 				e.printStackTrace(); 			} 		},"B").start(); 	}}

          Java介紹八鎖問題帶你徹底理解對(duì)象鎖和類鎖
          解釋:加個(gè)普通方法后發(fā)現(xiàn)和同步鎖無(wú)關(guān)。因此它無(wú)需等待同步鎖釋放。
          這里可以舉一個(gè)例子。班長(zhǎng)用它的手機(jī)要打電話。而我要向班長(zhǎng)借手機(jī)充電線,這兩個(gè)不互斥,因此可以在班長(zhǎng)打電話完之前就借走充電線。

          4.兩部手機(jī),請(qǐng)問先打印郵件還是短信

          /*手機(jī)類可以發(fā)郵件和發(fā)短信*/class Phone{ 	public synchronized void sendEmail() throws Exception{ 		TimeUnit.SECONDS.sleep(4);		//表示暫停4秒,它是一個(gè)枚舉類型 		System.out.println("***sendEmail"); 	} 	public synchronized void sendSMS() throws Exception{ 		System.out.println("***sendSMS"); 	} 	public void sayHello(){ 		System.out.println("***sayHello"); 	}}public class Lock8Demo { 	public static void main(String[] args) throws InterruptedException { 		//創(chuàng)建一個(gè)資源類 		Phone phone=new Phone(); 		Phone phone2=new Phone(); 		new Thread(()->{ 			try { 				phone.sendEmail(); 			} catch (Exception e) { 				// TODO Auto-generated catch block 				e.printStackTrace(); 			} 		},"A").start(); 		Thread.sleep(100); 		new Thread(()->{ 			try { 				//phone.sendSMS(); 				//phone.sayHello(); 				phone2.sendSMS(); 			} catch (Exception e) { 				// TODO Auto-generated catch block 				e.printStackTrace(); 			} 		},"B").start(); 	}}

          Java介紹八鎖問題帶你徹底理解對(duì)象鎖和類鎖

          解釋:這里可以舉一個(gè)例子,班長(zhǎng)用它的手機(jī)法郵件。我用我自己的手機(jī)打電話。那么誰(shuí)先誰(shuí)后就沒有關(guān)系。

          5.兩個(gè)靜態(tài)同步方法,同一部手機(jī),請(qǐng)問先打印郵件還是短信

          /*手機(jī)類可以發(fā)郵件和發(fā)短信*/class Phone{ 	public static synchronized void sendEmail() throws Exception{ 		TimeUnit.SECONDS.sleep(4);		//表示暫停4秒,它是一個(gè)枚舉類型 		System.out.println("***sendEmail"); 	} 	public static synchronized void sendSMS() throws Exception{ 		System.out.println("***sendSMS"); 	} 	public void sayHello(){ 		System.out.println("***sayHello"); 	}}public class Lock8Demo { 	public static void main(String[] args) throws InterruptedException { 		//創(chuàng)建一個(gè)資源類 		Phone phone=new Phone(); 		Phone phone2=new Phone(); 		new Thread(()->{ 			try { 				phone.sendEmail(); 			} catch (Exception e) { 				// TODO Auto-generated catch block 				e.printStackTrace(); 			} 		},"A").start(); 		Thread.sleep(100); 		new Thread(()->{ 			try { 				phone.sendSMS(); 				//phone.sayHello(); 				//phone2.sendSMS(); 			} catch (Exception e) { 				// TODO Auto-generated catch block 				e.printStackTrace(); 			} 		},"B").start(); 	}}

          Java介紹八鎖問題帶你徹底理解對(duì)象鎖和類鎖
          解釋:可以與問題6一起分析

          6.兩個(gè)靜態(tài)同步方法,兩部手機(jī),請(qǐng)問先打印郵件還是短信

          /*手機(jī)類可以發(fā)郵件和發(fā)短信*/class Phone{ 	public static synchronized void sendEmail() throws Exception{ 		TimeUnit.SECONDS.sleep(4);		//表示暫停4秒,它是一個(gè)枚舉類型 		System.out.println("***sendEmail"); 	} 	public static synchronized void sendSMS() throws Exception{ 		System.out.println("***sendSMS"); 	} 	public void sayHello(){ 		System.out.println("***sayHello"); 	}}public class Lock8Demo { 	public static void main(String[] args) throws InterruptedException { 		//創(chuàng)建一個(gè)資源類 		Phone phone=new Phone(); 		Phone phone2=new Phone(); 		new Thread(()->{ 			try { 				phone.sendEmail(); 			} catch (Exception e) { 				// TODO Auto-generated catch block 				e.printStackTrace(); 			} 		},"A").start(); 		Thread.sleep(100); 		new Thread(()->{ 			try { 				//phone.sendSMS(); 				//phone.sayHello(); 				phone2.sendSMS(); 			} catch (Exception e) { 				// TODO Auto-generated catch block 				e.printStackTrace(); 			} 		},"B").start(); 	}}

          Java介紹八鎖問題帶你徹底理解對(duì)象鎖和類鎖
          解析:
          static屬于一個(gè)類。也就說,他不屬于當(dāng)前對(duì)象this的一個(gè)獨(dú)立的個(gè)體。而是屬于全局的class。這就要考慮對(duì)象鎖和全局鎖的區(qū)別。全局鎖即類鎖。此時(shí)不管是一個(gè)phone還是多個(gè)phone都來(lái)自于同一個(gè)類Phone類?,F(xiàn)在不管你鎖到了哪個(gè)對(duì)象,我都要等他釋放完了這個(gè)鎖才能使用。

          7.1個(gè)靜態(tài)同步方法,1個(gè)普通同步方法,同一部手機(jī),請(qǐng)問先打印郵件還是短信

          /*手機(jī)類可以發(fā)郵件和發(fā)短信*/class Phone{ 	public static synchronized void sendEmail() throws Exception{ 		TimeUnit.SECONDS.sleep(4);		//表示暫停4秒,它是一個(gè)枚舉類型 		System.out.println("***sendEmail"); 	} 	public synchronized void sendSMS() throws Exception{ 		System.out.println("***sendSMS"); 	} 	public void sayHello(){ 		System.out.println("***sayHello"); 	}}public class Lock8Demo { 	public static void main(String[] args) throws InterruptedException { 		//創(chuàng)建一個(gè)資源類 		Phone phone=new Phone(); 		Phone phone2=new Phone(); 		new Thread(()->{ 			try { 				phone.sendEmail(); 			} catch (Exception e) { 				// TODO Auto-generated catch block 				e.printStackTrace(); 			} 		},"A").start(); 		Thread.sleep(100); 		new Thread(()->{ 			try { 				phone.sendSMS(); 				//phone.sayHello(); 				//phone2.sendSMS(); 			} catch (Exception e) { 				// TODO Auto-generated catch block 				e.printStackTrace(); 			} 		},"B").start(); 	}}

          Java介紹八鎖問題帶你徹底理解對(duì)象鎖和類鎖
          一個(gè)靜態(tài),一個(gè)普通。鎖的是同一部手機(jī)。靜態(tài)方法鎖的是Class.相當(dāng)于我們鎖了一個(gè)校門,一個(gè)是普通同步方法,鎖的是當(dāng)前對(duì)象。比如教師普通的們。鎖的對(duì)象不一樣。就不沖突

          8.1個(gè)靜態(tài)同步方法,1個(gè)普通同步方法,兩部手機(jī),請(qǐng)問先打印郵件還是短信

          /*手機(jī)類可以發(fā)郵件和發(fā)短信*/class Phone{ 	public static synchronized void sendEmail() throws Exception{ 		TimeUnit.SECONDS.sleep(4);		//表示暫停4秒,它是一個(gè)枚舉類型 		System.out.println("***sendEmail"); 	} 	public synchronized void sendSMS() throws Exception{ 		System.out.println("***sendSMS"); 	} 	public void sayHello(){ 		System.out.println("***sayHello"); 	}}public class Lock8Demo { 	public static void main(String[] args) throws InterruptedException { 		//創(chuàng)建一個(gè)資源類 		Phone phone=new Phone(); 		Phone phone2=new Phone(); 		new Thread(()->{ 			try { 				phone.sendEmail(); 			} catch (Exception e) { 				// TODO Auto-generated catch block 				e.printStackTrace(); 			} 		},"A").start(); 		Thread.sleep(100); 		new Thread(()->{ 			try { 				//phone.sendSMS(); 				//phone.sayHello(); 				phone2.sendSMS(); 			} catch (Exception e) { 				// TODO Auto-generated catch block 				e.printStackTrace(); 			} 		},"B").start(); 	}}

          Java介紹八鎖問題帶你徹底理解對(duì)象鎖和類鎖

          解釋:這個(gè)跟上面是一樣的。

          8鎖理論解釋

          1.一個(gè)對(duì)象里面如果有多個(gè)syncrhonized方法,某一時(shí)刻內(nèi),只要有一個(gè)線程去調(diào)用其中的一個(gè)synchronized方法了,其他的線程都只能等待,換句話說,某一時(shí)刻內(nèi),只能有唯一一個(gè)線程去訪問這些synchronized方法。
          鎖的是當(dāng)前對(duì)象this,被鎖定后,其他的線程都不能進(jìn)入到當(dāng)前對(duì)象的其他synchronized方法

          加個(gè)普通方法后發(fā)現(xiàn)和同步鎖無(wú)關(guān)。
          換乘兩個(gè)對(duì)象后,不是同一把鎖了,情況立刻發(fā)生變化。
          都換成靜態(tài)同步方法后,情況立刻變化
          所有的非靜態(tài)同步方法用的都是同一把鎖——實(shí)例對(duì)象本身

          2.synchronized實(shí)現(xiàn)同步的基礎(chǔ):java中的每個(gè)對(duì)象都可以作為鎖。
          具體表現(xiàn)為以下3種形式:

          1. 對(duì)于普通同步方法,鎖是當(dāng)前實(shí)例對(duì)象
          2. 對(duì)于同步方法塊,鎖是synchronized括號(hào)里面配置的對(duì)象。
            比如在方法里寫
            synchronized(this){
            }
          3. 對(duì)于靜態(tài)同步方法,鎖是當(dāng)前類的Class對(duì)象。

          當(dāng)一個(gè)進(jìn)程試圖訪問同步代碼塊時(shí),它首先必須得到鎖,退出或拋出異常必須釋放鎖。
          也就是說一個(gè)實(shí)例對(duì)象的非靜態(tài)同步方法獲取鎖后,該實(shí)例對(duì)象的其他非靜態(tài)同步方法必須等待獲取鎖的方法釋放鎖后才能獲取鎖。可是別的實(shí)例對(duì)象的非靜態(tài)同步方法因?yàn)楦搶?shí)例對(duì)象的非靜態(tài)同步方法用的是不同的鎖,所以無(wú)需等待該實(shí)例對(duì)象已獲取鎖的非靜態(tài)同步方法釋放鎖就可以獲取他們自己的鎖。

          所有的靜態(tài)同步方法用的也是同一把鎖—–類對(duì)象本身。
          這兩把鎖是兩個(gè)不同的對(duì)象,所以靜態(tài)同步方法與非靜態(tài)同步方法之間是不會(huì)有競(jìng)態(tài)條件的。(問題78)。即一個(gè)鎖class,一個(gè)鎖this,兩者不沖突。
          但是一旦一個(gè)靜態(tài)同步方法獲取鎖后,其他的靜態(tài)同步方法都必須等待該方法釋放鎖后才能獲取鎖。而不管是同一個(gè)實(shí)例對(duì)象的靜態(tài)方法之間,還是不同的實(shí)例對(duì)象的靜態(tài)同步方法之間,只要它們同一個(gè)類的實(shí)例對(duì)象。(問題56)

          贊(0)
          分享到: 更多 (0)
          網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)