線程syncronized(Object)的 使用

一、
public class MyThread implements Runnable {
	int ticket=10;
	/**
	 * 如果是兩個都是str堆引用的話,進入同步塊之後改變值,還是異步
	 */
	String str="abc";

	public  void run() {
		synchronized(str){
			str="sss";
			while(ticket>0){
				
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				System.out.println(Thread.currentThread().getName()+"-----"+ticket--);
			}
		}
	}

	public static void main(String[] args) {
		MyThread t1=new MyThread();
		new Thread(t1,"aa").start();
		new Thread(t1,"bb").start();

	}

	

}

二。
<pre name="code" class="java">public class MyThread implements Runnable {
	int ticket=10;
	/**
	 * 如果是兩個都是str堆引用的話,進入同步塊之後改變值,還是異步,不同的鎖
	 */
	
	/**
	 * 如果是靜態。只會在第一次加載類的時候初始化,所以不管下面new幾個Mythread實例,都還是同步的,同一把鎖
	 */
	static String str="abc";

	public  void run() {
		synchronized(str){
			
			while(ticket>0){
				
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				System.out.println(Thread.currentThread().getName()+"-----"+ticket--);
			}
		}
	}

	public static void main(String[] args) {
		MyThread t1=new MyThread();
		
		new Thread(t1,"aa").start();
		
		new Thread(new MyThread(),"bb").start();

	}

	

}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章