<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    日出星辰

    線(xiàn)程學(xué)習(xí)筆記【3】---互斥技術(shù)

    第一個(gè)示例更多的是運(yùn)用了內(nèi)部類(lèi)的特性:

    內(nèi)部類(lèi)重要特點(diǎn):可以訪(fǎng)問(wèn)外部的成員變量,所以?xún)?nèi)部類(lèi)不能在靜態(tài)方法中實(shí)例化。

    因?yàn)殪o態(tài)方法運(yùn)行時(shí)不需要?jiǎng)?chuàng)建實(shí)例對(duì)象,而內(nèi)部類(lèi)想要訪(fǎng)問(wèn)成員變量,意味著外部類(lèi)肯定要?jiǎng)?chuàng)建實(shí)例對(duì)象,二者相互矛盾。

    所以下面就會(huì)報(bào)錯(cuò)

    public class Synchronized01 {
    
    	public static void main(String args[]) {
    )
    		// final Outputer outputer=new Outputer(); //這樣做就沒(méi)有成員變量可以訪(fǎng)問(wèn)
    		// new Thread(new Runnable(){
    		//
    		// public void run() {
    		// while(true){
    		// try {
    		// Thread.sleep(10);
    		// } catch (InterruptedException e) {
    		// e.printStackTrace();
    		// }
    		// outputer.outputer("zhangsan");
    		// }
    		// }}).start();
    	}
    class Outputer {
    		void outputer(String name) {
    			int len = name.length();
    			for (int i = 0; i < len; i++) {
    				System.out.print(name.charAt(i));
    			}
    			System.out.println();
    		}
    	}
    }
    

    但如果改成這樣就沒(méi)有問(wèn)題

    public class Synchronized01 {
    
    	public static void main(String args[]) {	
                 new Synchronized01().init();
    	}
             // 此方法被調(diào)用時(shí)一定創(chuàng)建了外部類(lèi)對(duì)象
             private void init() {
                            // 運(yùn)行時(shí)找外部類(lèi)對(duì)象,找調(diào)用init方法的對(duì)象
    		final Outputer outputer = new Outputer(); 	
                              	new Thread(new Runnable() {
             			public void run() {
    				while (true) {
    					try {
    						Thread.sleep(10);
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    					outputer.outputer("zhangsan");
    				}
    			}
    		}).start();
    		new Thread(new Runnable() {
    
    			public void run() {
    				while (true) {
    					try {
    						Thread.sleep(10);
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    					outputer.outputer("lisi");
    				}
    			}
    		}).start();
    	}
    
    	class Outputer {
    		void outputer(String name) {
    			int len = name.length();
    			for (int i = 0; i < len; i++) {
    				System.out.print(name.charAt(i));
    			}
    			System.out.println();
    		}
    	}
    }

    運(yùn)行結(jié)果

            lisi zhangsan lisi zhangsan lisi zhangsan lisi zhangsan lisi zhangsan
            lisi zhangsan lisi zhangsan lisi zhanlgissain
            zlhiasnig san lzihsain gsan zlhiasnig san zlhiasnig san zlhiasnig san
            zlhiasnigsan zlhiasnig san lzihsain gsan lisi zhangsan lisi

    解決方法

    修改Ouputer

    class Outputer {
    		public void outputer(String name) {
    			int len = name.length();
    			synchronized (this) {// 兩個(gè)線(xiàn)程用的是同一個(gè)outputer對(duì)象
    				for (int i = 0; i < len; i++) {
    					System.out.print(name.charAt(i));
    				}
    				System.out.println();
    			}
    		}
    
    		// synchronized要在void之前
    		// 一個(gè)方法只能有一個(gè)synchronized,不然可能會(huì)造成死鎖
    		public synchronized void outputer2(String name) {
    			int len = name.length();
    			for (int i = 0; i < len; i++) {
    				System.out.print(name.charAt(i));
    			}
    			System.out.println();
    		}
    
    	}
    	// class Outputer {
    	// String xxx = "";
    	//
    	// public void outputer(String name) {
    	// int len = name.length();
                 // xxx必須是同一個(gè)對(duì)象,如果是name就仍然會(huì)出錯(cuò) name是兩個(gè)對(duì)象
    	// synchronized (xxx) { 	
                 // for (int i = 0; i < len; i++) {
    	// System.out.print(name.charAt(i));
    	// }
    	// System.out.println();
    	// }
    	// }
    	//
    	// }

    但如果每個(gè)run()中這樣寫(xiě)new Outputer()然后調(diào)用outputer(name)仍然會(huì)出錯(cuò),因?yàn)槊看蝞ew都是產(chǎn)生一個(gè)新的對(duì)象,而synchronized關(guān)鍵是針對(duì)同一個(gè)對(duì)象。

    public class Synchronized02 {
    
    	public static void main(String[] args) {
    		new Synchronized02().init();
    	}
    
    	private void init() {
    		final Outputer outputer = new Outputer();
    		new Thread(new Runnable() {
    
    			public void run() { // 要執(zhí)行的操作
    				while (true) { // 循環(huán)操作
    					try {
    						Thread.sleep(10);
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    					outputer.outputer("zhangsan");
    				}
    			}
    		}).start();
    		new Thread(new Runnable() {
    
    			public void run() {
    				while (true) {
    					try {
    						Thread.sleep(10);
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    					outputer.outputer("lisi");
                                                        //這樣仍然會(huì)出問(wèn)題 ----不是同一個(gè)對(duì)象。
    				// new Outputer().outputer("lisi"); 				}
    			}
    		}).start();
    
    	}
    
    	class Outputer {
    		public void outputer(String name) {
    			int len = name.length();
    			synchronized (this) {// 兩個(gè)線(xiàn)程用的是同一個(gè)outputer對(duì)象
    				for (int i = 0; i < len; i++) {
    					System.out.print(name.charAt(i));
    				}
    				System.out.println();
    			}
    		}
    
    		// synchronized要在void之前
    		// 一個(gè)方法只能有一個(gè)synchronized,不然可能會(huì)造成死鎖
    		public synchronized void outputer2(String name) {
    			int len = name.length();
    			for (int i = 0; i < len; i++) {
    				System.out.print(name.charAt(i));
    			}
    			System.out.println();
    		}
    
    	}
    	// class Outputer {
    	// String xxx = "";
    	//
    	// public void outputer(String name) {
    	// int len = name.length();
            // xxx必須是同一個(gè)對(duì)象,如果是name就仍然會(huì)出錯(cuò) name是兩個(gè)對(duì)象
    	// synchronized (xxx) {	
                // for (int i = 0; i < len; i++) {
    	// System.out.print(name.charAt(i));
    	// }
    	// System.out.println();
    	// }
    	// }
    	//
    	// }
    
    }
    一個(gè)內(nèi)部類(lèi)前面加上static就變成了外部類(lèi)
    靜態(tài)方法只能在外部類(lèi)中聲明
    靜態(tài)方法只和字節(jié)碼對(duì)象有關(guān)
    public class Synchronized03 {
    
    	public static void main(String[] args) {
    		new Synchronized03().init();
    	}
    
    	private void init() {
    		final Outputer outputer = new Outputer();
    		new Thread(new Runnable() {
    
    			public void run() { // 要執(zhí)行的操作
    				while (true) { // 循環(huán)操作
    					try {
    						Thread.sleep(10);
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    					outputer.outputer("zhangsan");
    				}
    			}
    		}).start();
    		new Thread(new Runnable() {
    
    			public void run() {
    				while (true) {
    					try {
    						Thread.sleep(10);
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    					outputer.outputer2("lisi");
    				}
    			}
    		}).start();
    
    	}
    
    	static class Outputer { // 加上static 相當(dāng)于是個(gè)外部類(lèi)
    		public void outputer(String name) {
    			int len = name.length();
                // 靜態(tài)方法不創(chuàng)建類(lèi)的實(shí)例對(duì)象,創(chuàng)建字節(jié)碼對(duì)象,靜態(tài)方法運(yùn)行時(shí)只和字節(jié)碼對(duì)象關(guān)聯(lián)
    		synchronized (Outputer.class) {
    				for (int i = 0; i < len; i++) {
    					System.out.print(name.charAt(i));
    				}
    				System.out.println();
    			}
    		}
    
    		// synchronized要在void之前
                             // 靜態(tài)方法只能在外部類(lèi)中聲明
    		public static synchronized void outputer2(String name) { 	
    		int len = name.length();
    			for (int i = 0; i < len; i++) {
    				System.out.print(name.charAt(i));
    			}
    			System.out.println();
    		}
    
    	}
    
    }

    posted on 2011-08-29 15:10 日出星辰 閱讀(72) 評(píng)論(0)  編輯  收藏


    只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 国产精品免费播放| 麻豆精品不卡国产免费看| h视频在线观看免费完整版| 国产亚洲综合成人91精品 | 无码日韩精品一区二区免费| 亚洲国产精品人久久| 亚洲a一级免费视频| 亚洲高清在线视频| 91精品免费观看| 亚洲国产精品xo在线观看| 国产a视频精品免费观看| 亚洲免费电影网站| 成人无遮挡裸免费视频在线观看| 国产成人精品日本亚洲专| 在线视频观看免费视频18| 久久狠狠爱亚洲综合影院| 好爽…又高潮了免费毛片| 亚洲第一成年免费网站| 亚洲成A人片在线观看无码3D | 国产一区二区免费视频| 亚洲黄色免费电影| 久久久久久国产a免费观看黄色大片| 亚洲自偷自偷精品| 亚洲日韩国产二区无码| 国产极品粉嫩泬免费观看| 免费观看四虎精品成人| 亚洲色成人WWW永久网站| 精品国产一区二区三区免费| 中文字幕亚洲精品| 色吊丝最新永久免费观看网站| 国产精品亚洲专一区二区三区| 亚洲中文字幕无码爆乳AV| 99爱在线精品视频免费观看9| 亚洲国产av一区二区三区丶| 国产午夜免费秋霞影院| 免费网站观看WWW在线观看| 国产精品成人免费综合| 精品免费久久久久国产一区| 日本久久久久亚洲中字幕| 午夜dj免费在线观看| 三年片免费观看大全国语|