Java--單例模式下多線程問題

//餓漢式
class Single{
	private static Single s=new Single();
	private Single()
	{
	}
	public static Single getInstance()
	{
		return s;
		
	}
}
//懶漢式

class Single{
	private static Single s;
	private Single(){
		
	}
	public static Sinlgle getInstance(){
	//雙重判斷爲了提高效率
		if(s==null)
		{
		//加入同步,爲了解決線程安全問題
			synchronized(Single.class){
				if(s==null)
				{
					s=new Single();
				}
			}
		}
		return s;
		
	}
}

死鎖問題
package com.locked;

public class Locked1 {
	public static String obj1=new String("obj1");
	public static String obj2=new String("obj2");
	public static void main(String[] args)
	{
		Lock1 lock1=new Lock1();
		Thread t1=new Thread(lock1);
		t1.start();
		//用了簡約形式的匿名內部類
		new Thread(new Runnable() {@Override
			public void run() {
			while(true)     
			{			 					
				synchronized(Ticket1.obj2)
				{
						System.out.println("C");
						synchronized(Ticket1.obj1)
						{
							System.out.println("D");
						}
				}
			}
		}}).start();
	}
	
}
class Lock1 implements Runnable{
	@Override
	public void run() {
		while(true)     
		{			 					
			synchronized(Ticket1.obj1)
			{
					System.out.println("A");
					synchronized(Ticket1.obj2)
					{
						System.out.println("B");
					}
			}
		}
	}
}		

結果
在這裏插入圖片描述
在這裏插入圖片描述

產生死鎖的原因:

當一個線程執行一半時,cpu轉去執行另一個線程,由於上一個線程所佔用的資源沒有用完,無法釋放掉,cup正在執行的線程無法繼續執行,而上一個線程也無法釋放。所以兩個線程就相互牽扯,稱這種現象爲死鎖。

線程間的通信

wait()方法:另當前線程掛起,並放棄CPU、同步資源,使別的線程可以訪問並修改共享資源,而當前線程排隊等待再次對資源的訪問。
notify()方法:喚醒正在排隊等待同步資源的線程中優先級最高者結束等待。
notifyAll()方法:喚醒正在排隊等待資源的所有線程結束等待。

這三種方法只有在synchronized方法或synchronized代碼塊中才能使用。

package com.Comumacation;

public class Com {
	

	public static void main(String[] args)
	{
		final Object obj=new Object();      //內部類訪問局部變量時要加final關鍵字
	
		new Thread(new Runnable() {
			@Override
			public void run() {
				
			synchronized(obj) {
				System.out.println("A1");				
				try {
					obj.wait();              //睡覺
				}
				catch(InterruptedException e)
				{
					e.printStackTrace();
				}
				System.out.println("A2");
				System.out.println("A3");
			}
		}}).start();
		new Thread(new Runnable() {
			@Override
			public void run() {
			
			synchronized(obj) {
				System.out.println("B1");
				System.out.println("B2");
				System.out.println("B3");
				obj.notify();            //叫醒對方
			}
		}}).start();
	}
	
}

在這裏插入圖片描述

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