实现线程同步,总结三个结论:
1.当多个线程同事执行synchronized(x){}同步代码块时呈同步效果
2.当其他线程执行x对象中synchronized同步方法时呈同步效果
3.当其他线程执行x对象方法里面的synchronized(this)代码块时也呈通过效果
注意:如果其他线程在调用线程时不添加synchronized关键字的方法时,仍然处于异步调用;
**
单例模式与多线程
- 饿汉模式
public class MyObject {
private static MyObject myObject = new MyObject();
public static MyObject getInstance() {
return myObject;
}
}
- 懒汉模式
public class MyObject {
private static MyObject myObject ;
synchronized public static MyObject getInstance() {
try {
if (myObject != null) {
} else {
myObject = new MyObject();
}
} catch (Exception e) {
// TODO: handle exception
}
return myObject;
}
}
当然,同步代码块也是可以(同步方法是对方法的整体进行持锁,其运行效率相对较低)。
使用DCL双检查锁机制(这是最成功的方法,解决“懒汉模式”遇到多线程的问题,DCL也是大多数多线程结合单例模式使用的解决方案。)
public class MyObject {
private volatile static MyObject myObject ;
public static MyObject getInstance() {
try {
if (myObject != null) {
} else {
Thread.sleep(3000);
synchronized (MyObject.class) {
if (myObject == null) {
myObject = new MyObject();
}
}
}
} catch (Exception e) {
// TODO: handle exception
}
return myObject;
}
}
**使用静态内置类实现单例模式**
public class MyObject {
// 静态内部类
private static class MyObjectHandler {
private static MyObject myObject = new MyObject();
}
private MyObject(){}
public static MyObject getInstance() {
return MyObjectHandler.myObject;
}
}
**使用static代码块实现单例模式**
public class MyObject {
private static MyObject insMyObject = null;
private MyObject(){}
static {
insMyObject = new MyObject();
}
public static MyObject getInstance() {
return insMyObject;
}
}
“`
线程状态
NEW
RUNNABLE
TERMINATED
BLOCKED
WAITING
TIMED_WAITING