java并发编程笔记(四)——安全发布对象
java并发编程笔记(四)——安全发布对象
发布对象
使一个对象能够被当前范围之外的代码所使用
对象逸出
一种错误的发布。当一个对象还没构造完成时,就使它被其他线程所见
不安全的发布对象
某一个类的构造方法为公共的。
如:
public class UnsafePublish {
    private String[] states = {"a", "b", "c"};
    public String[] getStates() {
        return states;
    }
    public static void main(String[] args) {
        UnsafePublish unsafePublish = new UnsafePublish();  //这行代码,发布了一个实例
        log.info("{}", Arrays.toString(unsafePublish.getStates()));
        unsafePublish.getStates()[0] = "d";
        log.info("{}", Arrays.toString(unsafePublish.getStates()));
    }
}
对象逸出的案例:
public class Escape {
    private int thisCanBeEscape = 0;
    public Escape () {
        new InnerClass();
    }
    private class InnerClass {
        public InnerClass() {
            log.info("{}", Escape.this.thisCanBeEscape);
        }
    }
    public static void main(String[] args) {
        new Escape();
    }
}
安全的发布对象
- 在静态初始化函数中初始化一个对象运用
 - 将对象的引用保存到volatile类型域或者AtomicReference对象中
 - 将对象的引用保存到某个正确的构造对象的final类型域中
 - 将对象的引用保存到一个由锁保护的域中
 
volatile使用场景
- 修饰装填码,保证操作原子性
 - 双重检测机制中,防止指令重排序
 
java并发编程笔记(四)——安全发布对象的更多相关文章
- [Java并发编程(四)] Java volatile  的理论实践
		
[Java并发编程(四)] Java volatile 的理论实践 摘要 Java 语言中的 volatile 变量可以被看作是一种 "程度较轻的 synchronized":与 ...
 - java并发编程笔记(十一)——高并发处理思路和手段
		
java并发编程笔记(十一)--高并发处理思路和手段 扩容 垂直扩容(纵向扩展):提高系统部件能力 水平扩容(横向扩容):增加更多系统成员来实现 缓存 缓存特征 命中率:命中数/(命中数+没有命中数) ...
 - java并发编程笔记(八)——死锁
		
java并发编程笔记(八)--死锁 死锁发生的必要条件 互斥条件 进程对分配到的资源进行排他性的使用,即在一段时间内只能由一个进程使用,如果有其他进程在请求,只能等待. 请求和保持条件 进程已经保持了 ...
 - java并发编程笔记(七)——线程池
		
java并发编程笔记(七)--线程池 new Thread弊端 每次new Thread新建对象,性能差 线程缺乏统一管理,可能无限制的新建线程,相互竞争,有可能占用过多系统资源导致死机或者OOM 缺 ...
 - java并发编程笔记(五)——线程安全策略
		
java并发编程笔记(五)--线程安全策略 不可变得对象 不可变对象需要满足的条件 对象创建以后其状态就不能修改 对象所有的域都是final类型 对象是正确创建的(在对象创建期间,this引用没有逸出 ...
 - java并发编程笔记(三)——线程安全性
		
java并发编程笔记(三)--线程安全性 线程安全性:  当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现 ...
 - java并发编程笔记(一)——并发编程简介
		
java并发编程笔记(一)--简介 线程不安全的类示例 public class CountExample1 { // 请求总数 public static int clientTotal = 500 ...
 - Java并发编程锁系列之ReentrantLock对象总结
		
Java并发编程锁系列之ReentrantLock对象总结 在Java并发编程中,根据不同维度来区分锁的话,锁可以分为十五种.ReentranckLock就是其中的多个分类. 本文主要内容:重入锁理解 ...
 - java并发编程笔记(十)——HashMap与ConcurrentHashMap
		
java并发编程笔记(十)--HashMap与ConcurrentHashMap HashMap参数 有两个参数影响他的性能 初始容量(默认为16) 加载因子(默认是0.75) HashMap寻址方式 ...
 
随机推荐
- Linux 学习 (五) DNS配置
			
没有配置DNS会引起的问题 yum命令 ssh命令等不能进行 错误: Could not resolve host: centos.ustc.edu.cn; 本文例子: CentOS7 下DNS配置 ...
 - 【ngx-ueditor】百度编辑器按下Shift键不触发contentChange事件
			
背景:基于Angular 6,引入ngx-ueditor 发现现象:如果以Shift键+任意键结尾,则ngModel会丢失包含shift键的字符 例如:输入“ABC+AB++++”,则ngModel中 ...
 - https中引用http
			
https里引用http不安全,会报错 解决方案 1.可以部署在http中,http中引用https不会存在安全问题报错 2.https中引用https,把需要引用的http部署成https
 - python- ' % '运算符的用途(非常重要)
			
%运算符就是用来格式化字符串的. 在字符串内部, %s表示用字符串替换, %d表示用整数替换, 有几个%?占位符,后面就跟几个变量或者值,顺序要对应好. 如果只有一个%?,括号可以省略. 另一种格式化 ...
 - VS2017/VS2019  git  Authentication failed for "XXXXXXXXXx"
			
解决办法: 控制面板,凭证管理==>删掉 对应代码仓库地址的凭证.删掉,是删掉.因为我更新了还是没有用.
 - js判断一件商品加还是减
			
<div class="right"> <div onclick="javascript: ClickJian(this);" data-i= ...
 - DNS 放大
			
DNS放大攻击是伪造一个DNS查询的报文,源地址改成想要攻击的IP.单个查询的包64字节,如果是ANY类型查询(或者DNSSEC记录),那么回复报文一般会大几十倍.当然,如果攻击者自己制造一个很大的T ...
 - css设置图片的高等于图片的高
			
<div class="box"> <img src="img/2222.jpg" /> </div> .box { pos ...
 - 如何使用 C++ Inja  html template 模板
			
C++ html template Inja是现代C ++的模板引擎,受到jinja for python的启发.它有一个简单而强大的模板语法,包含所有变量,循环,条件,包含,回调,您需要的注释,嵌套 ...
 - shell unique
			
由于uniq命令只能对相邻行进行去重复操作,所以在进行去重前,先要对文本行进行排序,使重复行集中到一起 1.文本行去重 (1)排序由于uniq命令只能对相邻行进行去重复操作,所以在进行去重前,先要对文 ...