如何安全的发布对象

对象的发布:使对象能够在当前作用域之外的代码中使用

如何安全的发布对象?

1:可变对象比如通过加锁的方式发布

2:不可变对象可以随意的被发布

可变对象必须通过安全的方式发布,这意味着发布和使用该对象的线程都必须使用同步.

要安全的发布对象,对象的状态和对象的引用必须对其他的线程可见,常见的做法有:

1:在静态初始化函数中初始化一个对象引用

2:将对象的引用保存到volatile类型域中

3:将对象的引用保存到正确构造对象的final域中

4:将对象的引用保存到一个由锁保护的域中

5:使用线程安全的容器

6:使用静态构造的对象,最简单和最安全的方式是使用静态初始化器.

  public static Holder holer = new Holder(23);

  原因是静态初始化器是由jvm在类的初始化阶段执行的,由于jvm内部存在同步机制,因此可以通过这种方式初始化的任何对象都可以被安全的发布.

时间: 2024-10-17 21:14:37

如何安全的发布对象的相关文章

Java 并发编程(二)对象的不变性和安全的发布对象

一.不变性 满足同步需求的另一种方法是使用不可变对象(Immutable Object).到目前为止,我们介绍了许多与原子性和可见性相关的问题,例如得到失效数据,丢失更新操作或光查到某个对象处于不一致的状态等等,都与多线程视图同时访问同一个可变的状态相关.如果对象的状态不会改变,那么这些问题与复杂性也就自然消失了. 如果某个对象在被创建后其状态就不能被修改,那么这个对象就被成为不可变对象.线程安全型是不可变对象的固有属性之一,他们的不变性条件是由构造函数创建的,只要他们的状态不改变,那么这些不变

【并发编程】安全发布对象

原文:慕课网高并发实战(五)- 安全发布对象 发布对象 发布对象:使一个对象能够被当前范围之外的代码所使用 对象溢出:一种错误的发布,当一个对象还没有构造完成时,就使它被其他线程所见 不正确的发布可变对象导致的两种错误: 1.发布线程意外的所有线程都可以看到被发布对象的过期的值 2.线程看到的被发布对象的引用是最新的,然而被发布对象的状态却是过期的 下面使用代码对不安全的发布和对象溢出进行说明: 不安全的发布示例 import com.gwf.concurrency.annoations.Not

如何安全发布对象

发布对象与逸出 发布对象: 使一个对象能够被当前范围之外的代码所使用,例如通过方法返回对象的引用,或者通过公有的静态变量发布对象 对象逸出: 一种错误的发布,当一个对象还没有构造完成时,就使它被其他线程所见 不正确的发布可变对象导致的两种错误: 发布线程意外的所有线程都可以看到被发布对象的过期的值 线程看到的被发布对象的引用是最新的,然而被发布对象的状态却是过期的 不安全的发布示例: package org.zero.concurrency.demo.example.publish; impor

jedis实现redis的消息队列、发布对象消息、字节数组与字符串相互转换

redis支持发布/订阅的消息队列机制,jedis提供了java访问redis的客户端,本文将描述如何用jedis实现简单的消息队列,并传输对象. redis支持发布.订阅的功能,基本的命令有publish.subscribe等.在jedis中,有对应的java方法,并且只能发布字符串消息.为了传输对象,需要将对象进行序列化,并封装成字符串进行处理.将对象序列化后,只能成为字节流,如何封装成字符串是一个难点,具体可参考下面的代码. 实现三个类,一个对应publish.一个对应subscribe.

SpringBoot中RedisTemplate订阅发布对象

解说 RedisMessageListenerContainer Redis订阅发布的监听容器,你的消息发布.订阅配置都必须在这里面实现 addMessageListener(MessageListenerAdapter,PatternTopic) 新增订阅频道及订阅者,订阅者必须有相关方法处理收到的消息. setTopicSerializer(RedisSerializer) 对频道内容进行序列化解析 MessageListenerAdapter 监听适配器 MessageListenerAd

并发环境下,不安全发布对象示例代码

package com.mm.concurrent; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class TestConcurrent { public static 

Java 并发编程(二)对象的发布逸出和线程封闭

对象的发布与逸出 "发布(Publish)"一个对象是指使对象能够在当前作用域之外的代码中使用.可以通过 公有静态变量,非私有方法,构造方法内隐含引用 三种方式. 如果对象构造完成之前就发布该对象,就会破坏线程安全性.当某个不应该发布的对象被发布时,这种情况就被称为逸出(Escape). 下面我们首先来看看一个对象是如何逸出的. 发布对象最简单的方法便是将对象的引用保存到一个共有的静态变量中,以便任何类和线程都能看见对象,如下面代码. public static Set<Stri

Java线程安全性中的对象发布和逸出

发布(Publish)和逸出(Escape)这两个概念倒是第一次听说,不过它在实际当中却十分常见,这和Java并发编程的线程安全性就很大的关系. 什么是发布?简单来说就是提供一个对象的引用给作用域之外的代码.比如return一个对象,或者作为参数传递到其他类的方法中. 什么是逸出?如果一个类还没有构造结束就已经提供给了外部代码一个对象引用即发布了该对象,此时叫做对象逸出,对象的逸出会破坏线程的安全性. 概念我们知道了,可我们要关注什么地方呢?我们要关注的时候就是逸出问题,在不该发布该对象的地方就

发布线程安全的对象

一.总 发布对象:使对象能在当前作用域之外的代码中使用.既将对象的引用传递到其他类的变量和方法. (1)变量的静态初始化 (2)声明为volatile变量 或 AtomicReferance对象 (3)声明为final变量 (4)将变量保存在线程安全的容器中(既保存在一个由锁保护的域中) 二.分 1.成员变量的初始化: (1)直接初始化 (2)构造函数初始化 2.在Java内存模型中,final域能确保初始化过程的安全性,从而可以不受限制的访问不可变对象,并在共享这些对象时无需同步. 在可变对象