//餓漢式
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();
}
}