首页 / JAVA / java中安全发布对象
java中安全发布对象
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java中安全发布对象,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3270字,纯文字阅读大概需要5分钟。
内容图文
![java中安全发布对象](/upload/InfoBanner/zyjiaocheng/613/665076794a044f43b9bec752093d11e0.jpg)
文章目录
发布对象
发布对象:使一个对象能够被当前范围之外的代码所使用
对象逸出:一种错误的发布。当一个对象还没有构造完成时,就使它被其他线程所见
安全发布对象四种方法
1、 在静态初始化函数中初始化一个对象引用
2、 将对象的引用保存到volatile类型域或者AtomicReference对象中
3、 将对象的引用保存到某个正确构造对象的final类型域中
4 、将对象的引用保存到一个由锁保护的域中
私有构造函数,单例对象,静态工厂方法获取对象
懒汉模式: 单例实例在第一次使用时进行创建(线程不安全)
懒汉模式也可以实现线程安全,给getInstance方法添加synchronized关键字(不推荐,因为性能不好)
双重同步锁单例模式:双重监测机制,在方法内部加synchronized关键字(不是线程安全的)
原因是,创建对象是,分为以下三个步骤:
1、 memory = allocate() 分配对象的内存空间
2、ctorInstance() 初始化对象
3、instance = memory() 设置instance指向刚分配的内存
由于JVM和cpu优化,可能会发生指令重排:
1、 memory = allocate() 分配对象的内存空间
3、 instance = memory() 设置instance指向刚分配的内存
2、 ctorInstance() 初始化对象
当以上面这种指令执行时,线程A执行到3 instance = memory() 设置instance指向刚分配的内存 这一步时,线程B执行if(instance == null)这段代码,此时instance != null,线程B直接return instance,导致对象没有初始化完毕就返回
解决办法就是限制对象创建时进行指令重排,volatile+双重监测机制->禁止指令重排引起非线程安全
饿汉模式: 单例实例在类装载时进行创建(线程安全)
枚举模式: 线程安全
懒汉模式
package com.mmall.concurrency.example.singleton;
import com.mmall.concurrency.annoations.ThreadSafe;
/**
* 懒汉模式 -》 双重同步锁单例模式
* 单例实例在第一次使用时进行创建
*/
@ThreadSafe
public class SingletonExample5 {
// 私有构造函数
private SingletonExample5() {
}
// 1、memory = allocate() 分配对象的内存空间
// 2、ctorInstance() 初始化对象
// 3、instance = memory 设置instance指向刚分配的内存
// 单例对象 volatile + 双重检测机制 -> 禁止指令重排
private volatile static SingletonExample5 instance = null;
// 静态的工厂方法
public static SingletonExample5 getInstance() {
if (instance == null) { // 双重检测机制 // B
synchronized (SingletonExample5.class) { // 同步锁
if (instance == null) {
instance = new SingletonExample5(); // A - 3
}
}
}
return instance;
}
}
饿汉模式
package com.mmall.concurrency.example.singleton;
import com.mmall.concurrency.annoations.ThreadSafe;
/**
* 饿汉模式
* 单例实例在类装载时进行创建
*/
@ThreadSafe
public class SingletonExample6 {
// 私有构造函数
private SingletonExample6() {
}
// 单例对象
private static SingletonExample6 instance = null;
static {
instance = new SingletonExample6();
}
// 静态的工厂方法
public static SingletonExample6 getInstance() {
return instance;
}
public static void main(String[] args) {
System.out.println(getInstance().hashCode());
System.out.println(getInstance().hashCode());
}
}
枚举模式
package com.mmall.concurrency.example.singleton;
import com.mmall.concurrency.annoations.Recommend;
import com.mmall.concurrency.annoations.ThreadSafe;
/**
* 枚举模式:最安全
*/
@ThreadSafe
@Recommend
public class SingletonExample7 {
// 私有构造函数
private SingletonExample7() {
}
public static SingletonExample7 getInstance() {
return Singleton.INSTANCE.getInstance();
}
private enum Singleton {
INSTANCE;
private SingletonExample7 singleton;
// JVM保证这个方法绝对只调用一次
Singleton() {
singleton = new SingletonExample7();
}
public SingletonExample7 getInstance() {
return singleton;
}
}
}
内容总结
以上是互联网集市为您收集整理的java中安全发布对象全部内容,希望文章能够帮你解决java中安全发布对象所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。