JAVA多线程同步的理解,主要论述单例模式的线程安全问题
2015-12-02 11:44
375 查看
多线程
同步的优缺点
优点:解决了线程的安全问题
缺点:效率变低
发生线程的安全的前提
1、要多线程,单线程没有线程安全问题
2、有线程共享数据,且操作共享数据的步骤不止一步
非静态方法的同步锁是this,example:public sychronized get(){};
静态方法的同步锁是字节码文件Class,example:public sychronized static get(){};
同步代码块和同步函数解决线程安全问题,要公用同一吧锁
同步代码块和同步函数的区别:
同步代码块的锁可以使任意对象,而同步函数的锁非静态是this,静态是字节码对象
单例模式的线程安全问题
恶汉模式
懒汉模式
单例模式中恶寒模式是没有线程安全的问题的,但懒汉模式的情况在多线程下就有可能产生不止一个对象
改进后的
懒汉模式
这种改进,效率不加,因为每次getInstance的时候都要判断两次,一次是否有锁,一次是否为空,
二次改进后
懒汉模式
同步的优缺点
优点:解决了线程的安全问题
缺点:效率变低
发生线程的安全的前提
1、要多线程,单线程没有线程安全问题
2、有线程共享数据,且操作共享数据的步骤不止一步
非静态方法的同步锁是this,example:public sychronized get(){};
静态方法的同步锁是字节码文件Class,example:public sychronized static get(){};
同步代码块和同步函数解决线程安全问题,要公用同一吧锁
同步代码块和同步函数的区别:
同步代码块的锁可以使任意对象,而同步函数的锁非静态是this,静态是字节码对象
单例模式的线程安全问题
恶汉模式
public class Liuyifan{ private Liuyifan l = new Liuyifan(); privateLiuyifan(){} public Liuyifan getInstance(){ return l; } }
懒汉模式
public class Liuyifan{ private Liuyifan l = null; private Liuyifan(){ l = new Liuyifan(); } public Liuyifan getInstance(){ if(l==null){ new Liuyifan(); } return l; } }
单例模式中恶寒模式是没有线程安全的问题的,但懒汉模式的情况在多线程下就有可能产生不止一个对象
改进后的
懒汉模式
public class Liuyifan{ private Liuyifan l = null; private Liuyifan(){ l = new Liuyifan(); } public synchronized Liuyifan getInstance(){ if(l==null){ new Liuyifan(); } return l; } }
这种改进,效率不加,因为每次getInstance的时候都要判断两次,一次是否有锁,一次是否为空,
二次改进后
懒汉模式
public class Liuyifan{ private Liuyifan l = null; private Liuyifan(){ l = new Liuyifan(); } public Liuyifan getInstance(){ if(l!=null){ synchronized(l){ if(l==null){ new Liuyifan(); } } } return l; } }如有错误,请留下评论,共同探讨,代码是在记事本手打的拼写如有错误,勿怪
相关文章推荐
- Java编译时出现Selection does not contain a main type错误的快速解决方法
- java 手机号正则表达式
- Java编程中如何在一个数值范围内生成一个伪随机数
- java中变量、对象的存储
- JavaEE_Mybatis_SpringMVC_Spring_lesson3_注解处理器映射器与适配器以及处理器(Controller)
- JavaSE(19)(两种开启多线程方式)
- java学习之正则表达式日记
- java enum
- eclipse控制台输出重定向
- java设计模式----工厂模式
- java中多种排序算法总结
- 使用spring动态路由切换主从库
- java多线程-interrupt
- 字符串乱码处理,java
- 使用spring动态路由切换主从库
- spring transaction源码分析--事务架构
- JDK 和JRE的区别
- KMP算法(Knuth-Morris-Pratt ),java实现KMP算法
- Java多线程优先级的一些测试
- java传值还是传引用的问题详解