标签:style class blog code tar color
z;略懂
package 单例模式; public class Singleton { private static Singleton instance=null; private Singleton() { System.out.println("单例构造函数"); } public static Singleton getInstance() { if(instance==null) { instance=new Singleton(); } return instance; } public static void main(String[] args) { //创建50个线程,对非同步的方法getinstance 就行获取对象 for(int i=0;i<30;i++) { new Thread(new Runnable(){ @Override public void run() { System.out.println(Singleton.getInstance()); } }).start(); } } }
例构造函数
单例构造函数
单例模式.Singleton@75da931b
单例构造函数
单例构造函数
单例模式.Singleton@34780af5
单例模式.Singleton@34780af5
单例构造函数
单例模式.Singleton@157ee3e5
单例模式.Singleton@157ee3e5
单例模式.Singleton@34780af5
单例模式.Singleton@2b1be57f
单例模式.Singleton@157ee3e5
单例模式.Singleton@2b1be57f
单例模式.Singleton@60f00e0f
单例模式.Singleton@157ee3e5
加入synchronized部分结果如下:全部都唯一啊,你自己试试。
例构造函数
单例模式.Singleton@78214f6b
单例模式.Singleton@78214f6b
单例模式.Singleton@78214f6b
单例模式.Singleton@78214f6b
单例模式.Singleton@78214f6b
单例模式.Singleton@78214f6b、
z:减少的所得粒度和上锁的范围。比如数据库中有对表 页 行 加锁,粒度低了,锁的竞争就减少了。
比如在读写锁,如果只有一种锁的,那么SS也是互斥的,通过将锁分割成读写锁,减少了竞争。
对于队列解锁,我可以设置头设置一个锁,尾巴设置一个锁,这样不就减小了锁的粒度,
还有并行的hashmap、
z: 本文中synchronzide同步的粒度大,因为instance=!=null不用加锁。
所以改造如下;
package 单例模式; public class Singleton { private static Singleton instance=null; private Singleton() { System.out.println("单例构造函数"); } public static Singleton getInstance() { if(instance==null) { synchronized(Singleton.class) { if(instance==null) { instance=new Singleton(); } } } return instance; } public static void main(String[] args) { //创建50个线程,对非同步的方法getinstance 就行获取对象 for(int i=0;i<30;i++) { new Thread(new Runnable(){ @Override public void run() { System.out.println(Singleton.getInstance()); } }).start(); } } }
第一步:只有为空才会进同步块,说了,如果有了实例就直接返回结果
第二部:判断为空:按照线程的不可确定性,两个线程同时判断
if(instance==null) 都会先后进入同步快,为出现创建两个实例
package 单例模式; public class Singleton { private static Singleton instance=null; private Singleton() { System.out.println("单例构造函数"); } public static Singleton getInstance() { if(instance==null) { synchronized(Singleton.class) { instance=new Singleton(); } } return instance; } public static void main(String[] args) { //创建50个线程,对非同步的方法getinstance 就行获取对象 for(int i=0;i<100;i++) { new Thread(new Runnable(){ @Override public void run() { System.out.println(Singleton.getInstance()); } }).start(); } } }
例构造函数
单例构造函数
单例模式.Singleton@46993aaa
单例模式.Singleton@52e5376a
单例模式.Singleton@46993aaa
单例模式.Singleton@46993aaa
单例模式.Singleton@46993aaa
单例模式.Singleton@46993aaa
单例构造函数
单例模式.Singleton@157ee3e5
单例模式.Singleton@46993aaa
单例模式.Singleton@157ee3e5
单例模式.Singleton@157ee3e5
单例模式.Singleton@157ee3e5
单例模式.Singleton@157ee3e5
单例模式.Singleton@157ee3e5
单例模式.Singleton@157ee3e5
单例模式.Singleton@157ee3e5
单例模式.Singleton@157ee3e5
单例模式.Singleton@157ee3e5
单例模式.Singleton@157ee3e5
单例模式.Singleton@157ee3e5
单例模式.Singleton@157ee3e5
单例模式.Singleton@157ee3e5
单例模式.Singleton@157ee3e5
单例模式.Singleton@157ee3e5
单例模式.Singleton@157ee3e5
单例模式.Singleton@157ee3e5
单例模式.Singleton@157ee3e5
单例模式.Singleton@157ee3e5
单例模式.Singleton@157ee3e5
单M:
z:
张小二求职记之 单例模式(三)之决战多线程,布布扣,bubuko.com
标签:style class blog code tar color
原文地址:http://www.cnblogs.com/hansongjiang/p/3808219.html