//饿汉式
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();
}
}