线程同步在保证安全的同时,因为同一时间只有一个线程能访问共享数据,效率变低了。
先来看看懒汉式线程安全,源代码如下,
package com.ucar.quan.thread;
public class SingleTonTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
SingleTon s1 = SingleTon.getInstance();
SingleTon s2 = SingleTon.getInstance();
System.out.println(s1 == s2);
}
}
class SingleTon{
private SingleTon(){
}
private static SingleTon instance = null;
public static SingleTon getInstance(){
if(instance == null){
instance = new SingleTon();
}
return instance;
}
}
在单线程中,输出结果为true木有问题。
使用同步机制,
在一般的方法中可以使用this,
但在静态方法中使用当前类的对象当锁。(类名.class)
如下。
package com.ucar.quan.thread;
public class SingleTonTest {
/**
* @param args
* 权兴权意-20160811
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SingleTon s1 = SingleTon.getInstance();
SingleTon s2 = SingleTon.getInstance();
System.out.println(s1 == s2);
//Class c = SingleTon.class;
}
}
class SingleTon {
private SingleTon() {
}
private static SingleTon instance = null;
public static SingleTon getInstance() {
synchronized (SingleTon.class) {
if (instance == null) {
instance = new SingleTon();
}
}
return instance;
}
}
尽管由于线程锁效率降低了,但我们依然可以进一步优化,如下:
package com.ucar.quan.thread;
public class SingleTonTest {
/**
* @param args
* 权兴权意-20160811
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SingleTon s1 = SingleTon.getInstance();
SingleTon s2 = SingleTon.getInstance();
System.out.println(s1 == s2);
// Class c = SingleTon.class;
}
}
class SingleTon {
private SingleTon() {
}
private static SingleTon instance = null;
public static SingleTon getInstance() {
if (instance == null) {
synchronized (SingleTon.class) {
if (instance == null) {
instance = new SingleTon();
}
}
}
return instance;
}
}