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

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

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

    日出星辰

    線程學習筆記【3】---互斥技術

    第一個示例更多的是運用了內部類的特性:

    內部類重要特點:可以訪問外部的成員變量,所以內部類不能在靜態方法中實例化

    因為靜態方法運行時不需要創建實例對象,而內部類想要訪問成員變量,意味著外部類肯定要創建實例對象,二者相互矛盾。

    所以下面就會報錯

    public class Synchronized01 {
    
    	public static void main(String args[]) {
    )
    		// 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();
    	}
    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();
    		}
    	}
    }
    

    但如果改成這樣就沒有問題

    public class Synchronized01 {
    
    	public static void main(String args[]) {	
                 new Synchronized01().init();
    	}
             // 此方法被調用時一定創建了外部類對象
             private void init() {
                            // 運行時找外部類對象,找調用init方法的對象
    		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();
    		}
    	}
    }

    運行結果

            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) {// 兩個線程用的是同一個outputer對象
    				for (int i = 0; i < len; i++) {
    					System.out.print(name.charAt(i));
    				}
    				System.out.println();
    			}
    		}
    
    		// synchronized要在void之前
    		// 一個方法只能有一個synchronized,不然可能會造成死鎖
    		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必須是同一個對象,如果是name就仍然會出錯 name是兩個對象
    	// synchronized (xxx) { 	
                 // for (int i = 0; i < len; i++) {
    	// System.out.print(name.charAt(i));
    	// }
    	// System.out.println();
    	// }
    	// }
    	//
    	// }

    但如果每個run()中這樣寫new Outputer()然后調用outputer(name)仍然會出錯,因為每次new都是產生一個新的對象,而synchronized關鍵是針對同一個對象。

    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() { // 要執行的操作
    				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");
                                                        //這樣仍然會出問題 ----不是同一個對象。
    				// new Outputer().outputer("lisi"); 				}
    			}
    		}).start();
    
    	}
    
    	class Outputer {
    		public void outputer(String name) {
    			int len = name.length();
    			synchronized (this) {// 兩個線程用的是同一個outputer對象
    				for (int i = 0; i < len; i++) {
    					System.out.print(name.charAt(i));
    				}
    				System.out.println();
    			}
    		}
    
    		// synchronized要在void之前
    		// 一個方法只能有一個synchronized,不然可能會造成死鎖
    		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必須是同一個對象,如果是name就仍然會出錯 name是兩個對象
    	// synchronized (xxx) {	
                // for (int i = 0; i < len; i++) {
    	// System.out.print(name.charAt(i));
    	// }
    	// System.out.println();
    	// }
    	// }
    	//
    	// }
    
    }
    一個內部類前面加上static就變成了外部類
    靜態方法只能在外部類中聲明
    靜態方法只和字節碼對象有關
    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() { // 要執行的操作
    				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.outputer2("lisi");
    				}
    			}
    		}).start();
    
    	}
    
    	static class Outputer { // 加上static 相當于是個外部類
    		public void outputer(String name) {
    			int len = name.length();
                // 靜態方法不創建類的實例對象,創建字節碼對象,靜態方法運行時只和字節碼對象關聯
    		synchronized (Outputer.class) {
    				for (int i = 0; i < len; i++) {
    					System.out.print(name.charAt(i));
    				}
    				System.out.println();
    			}
    		}
    
    		// synchronized要在void之前
                             // 靜態方法只能在外部類中聲明
    		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) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲乱妇老熟女爽到高潮的片| 国产精品久久久久久久久久免费| www.亚洲精品.com| 亚洲国产精品成人午夜在线观看 | 亚洲影院在线观看| 四虎成人精品永久免费AV| 婷婷久久久亚洲欧洲日产国码AV| 在线观看免费无码专区| 亚洲乱亚洲乱妇无码麻豆| 免费人成激情视频在线观看冫| 亚洲国产成人精品无码区在线观看| 国产午夜成人免费看片无遮挡 | 无码国产精品一区二区免费3p| 精品亚洲综合久久中文字幕| 国产激情免费视频在线观看| 亚洲精品韩国美女在线| 欧亚精品一区三区免费| 国产区图片区小说区亚洲区| 国产成人毛片亚洲精品| 色欲色香天天天综合网站免费| 亚洲经典在线观看| 日韩免费一区二区三区| 日韩毛片一区视频免费| 亚洲春色在线视频| 国产精品免费观看久久| 人与动性xxxxx免费| 久久久久亚洲AV成人无码| 最近中文字幕无免费视频| 高清免费久久午夜精品| 亚洲邪恶天堂影院在线观看| 18禁成年无码免费网站无遮挡| 一区二区三区免费在线观看| 亚洲资源在线观看| 免费人成在线观看网站品爱网日本| 成人电影在线免费观看| 亚洲欧美精品午睡沙发| 亚洲日韩精品无码一区二区三区 | 五月婷婷亚洲综合| 最近免费最新高清中文字幕韩国 | 久久精品国产精品亚洲毛片| 看全色黄大色大片免费久久|