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();
	}
	
}

在这里插入图片描述

发布了55 篇原创文章 · 获赞 47 · 访问量 3526

猜你喜欢

转载自blog.csdn.net/qq_42577542/article/details/104406089