当前位置: 首页 > news >正文

企业营销策划心得体会长沙网站优化培训

企业营销策划心得体会,长沙网站优化培训,手机虚拟空间,网站备案人可以改吗final的安全发布 两个关键字“发布”“安全” 所谓发布通俗一点的理解就是创建一个对象,使这个对象能被当前范围之外的代码所使用 比如Object o new Object(); 然后接下来使用对象o 但是对于普通变量的创建,之前分析过,大致分为三个步骤&am…

final的安全发布

两个关键字“发布”“安全”
所谓发布通俗一点的理解就是创建一个对象,使这个对象能被当前范围之外的代码所使用
比如Object o = new Object();
然后接下来使用对象o
但是对于普通变量的创建,之前分析过,大致分为三个步骤:
1、分配内存空间
2、将o指向分配的内存空间
3、调用构造函数来初始化对象
这三个步骤不是原子的,如果执行到第二步,还没有进行初始化,此时对象已经不是null了,如果被其他代码访问,这将收获一个错误的结果。
或者说对象尚未完全创建就被使用了,其他线程看到的结果可能是不一致的,这就是不安全的发布
根本原因就是JVM创建对象的过程涉及到分配空间、指针设置、数据初始化等步骤,并不是同步的,涉及到主存与缓存、处理器与寄存器等,可见性没办法得到保障
所以说,什么是安全发布,简单理解就是对象的创建能够保障在被别人使用前,已经完成了数据的构造设置,或者说一个对象在使用时,已经完成了初始化。
不幸的是,Java对此并没有进行保障,你需要自己进行保障,比如synchronized关键字,原子性、排他性就可以做到这一点

不安全的发布实例

怎么保障安全发布?有几种方法:

一种是刚才提到的锁机制,通过加锁可以保障中间状态不会被读取
另外还有:
1、借助于volatile或者AtomicReference声明对象
2、借助于final关键字
3、在静态初始化块中,进行初始化(JVM会保障)
4、将对象引用保存到一个由锁保护的域中
5、借助AtomicReference

很显然,对于锁机制,那些线程安全的容器比如ConcurrentMap,也是满足这条的,所以也是安全发布
对于final,当你创建一个对象时,使用final关键字能够使得另一个线程不会访问到处于“部分创建”的对象
因为:当构造函数退出时,final字段的值保证对访问构造对象的其他线程可见
如果某个成员是final的,JVM规范做出如下明确的保证:
一旦对象引用对其他线程可见,则其final成员也必须正确的赋值
所以说借助于final,就如同你对对象的创建访问加锁了一般,天然的就保障了对象的安全发布。
对于普通的变量,对象的内存空间分配、指针设置、数据初始化,和将这个变量的引用赋值给另一个引用,之间是可能发生重排序的,所以也就导致了其他线程可能读取到不一致的中间状态
但是对于final修饰的变量,JVM会保障顺序
不会在对final变量的写操作完成之前,与将变量引用赋值给其他变量之间进行重排序,也就是final变量的设置完成始终会在被读取之前
final除了不可变的定义之外,还与线程安全发布息息相关
借助于final,可以达到对象安全发布的保障,只需要借助于final,不在需要任何额外的付出,他能够保障在多线程环境下,总是能够读取到正确的初始化的值
所以,如果你不希望变量后续被修改,你应该总是使用final关键字
而且,很显然在某些场景下,final也可以解决一定的安全问题

实例

使用synchronized锁的时候,作为锁的对象最好要加上final修饰符,因为可能线程会改变锁变量持有的具体的对象。
demo如下:

public class Test02 {
static Object lock = new Object();

public static void main(String[] args) {Thread t1 = new Thread(() -> {lock = new Object();synchronized (lock) {for (int i = 0; i < 10; i++) {try {Thread.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("A");}}});Thread t2 = new Thread(() -> {lock = new Object();synchronized (lock) {for (int i = 0; i < 10; i++) {try {Thread.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("B");}}});t1.start();t2.start();
}

}

但是要是把锁改成final的。代码如下:

public class Test02 {static final Object lock = new Object();public static void main(String[] args) {Thread t1 = new Thread(() -> {
//            lock = new Object(); // 编译出错,final不能修改synchronized (lock) {for (int i = 0; i < 10; i++) {try {Thread.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("A");}}});Thread t2 = new Thread(() -> {
//            lock = new Object();synchronized (lock) {for (int i = 0; i < 10; i++) {try {Thread.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("B");}}});t1.start();t2.start();}
}

实例参考:https://juejin.cn/post/7104070219806539806
原理参考:https://www.cnblogs.com/noteless/p/10416678.html

http://www.yayakq.cn/news/483681/

相关文章:

  • 天空在线网站建设中国软件
  • 广州网站开发定制设计wordpress输出分类
  • 建设网站的基本流程安徽省住房城乡建设厅网站官网
  • 网站备案费一般是多少内蒙古建设工程造价信息网解释
  • 福州有名的公司网站设计南京前十名传媒广告公司
  • 织梦快速做双语网站做外贸主要在那些网站找单
  • 团购网站短信平台wordpress多媒体mp4
  • 商业网站缩写专业手机网站建设平台
  • 山东网站建设设计哈尔滨百度推广排名优化
  • 莲花网站建设桂林市建设工程质量监督站网站
  • 网站开发工具最适合厦门开发网站公司
  • 360网站做二维码做课展网站
  • 腾讯企业网站建设手机无法登录wordpress
  • 网站图标怎么下载有哪些做短租的网站
  • 网站建设为什么必须有服务器网站seo招聘
  • 淘宝网站建设策划书青岛路桥建设集团有限公司网站
  • 大型网站都怎么做推广上海地区网站开发公司
  • 有没有做门面设计的网站品牌网站建设价位
  • 长春专用网站建设wordpress 数据库权限
  • 网站百度未收录商桥安装显示网站改版 请示
  • 九江网站设计公司余江网站建设
  • 域名没备案如何建设网站网站备案网站名称
  • 昆明网站建设推广字节跳动员工待遇
  • 厦门正规网站建设多少龙华营销型网站建设公司
  • 中国建设监理协会网站网站设计简单吗
  • 烟台网站建设开发网络与设计是干嘛的
  • 怎么查看一个网站的后台如何在图片上做网站水印图
  • 免费 个人 网站广州优秀网站建设
  • 规划网站站点需要遵循哪些原则wordpress 转换成帝国
  • 网站 动画 怎么做的深圳保障性住房有哪些