`

《Java并发编程》之一:对象的共享

    博客分类:
  • Java
阅读更多

====不可变对象定义:====

1,对象创建后其状态不能修改

2,对象所有域都是final的

3,对象时正确创建的,在对象构造期间,this引用没有逸出

 

====安全发布对象的含义:====

确保使用对象的线程能够看到该对象处于已发布的状态,是对象的状态呈现一致性视图。

安全发布对象的常用模式:

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

一个正确构造的对象可以通过以下方式来安全发布:

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

* 将对象引用保存到volatile类型域或者AtomicReference对象中

* 将对象引用保存到某个正确构造函数对象的final类型域中

* 将对象引用保存到一个由锁保护的域中,这个常见的就是保存到线程安全的容器中比如Vector或SynchronizedList等等

线程安全的容器类:

1,将一个键/值放入Hashtable、SynchronizedMap、ConcurrentMap中,可安全将它发布给任何从这些容器中访问它的线程。

2,将某个元素放入Vector、CopyOnWriteArrayList、CopyOnWriteArraySet、SynchronizedList、SynchronizedSet中

3,将某个元素放入BlockingQueue、ConcurrentLinkedQueue中

4,其他比如Future和Exchanger等,也能安全发布对象。

通常,要发布一个静态构造的函数,最简单和最安全的做法是使用静态的初始化器,这个在JVM里面有同步保证。

public static Holder holder = new Holder(42);

 

====事实不可变对象====

如果对象从技术上看是可以变的,但其状态在发布后就不会再改变,那么把这种现象称为事实不可变对象 Effectively Immutable Object。比如要保存每位用户的最近登录时间Date类型,原则上可以修改Date,但业务上初始化后就不会了,那么使用SynchronizedMap就足够了,里面的安全机制可确保Date会被安全的发布。放入后不会改变那就可以了。

 

对象的发布需求取决于它的可变性:

1,不可变对象可以通过任意机制来发布

2,事实不可变对象必须通过安全方式发布

3,可变对象必须通过安全方式发布,并且必须是线程安全的或者由某个锁保护起来。

 

在并发程序中使用和共享对象时,可以使用一些实用策略,包括:

线程封闭:

线程封闭的对象只能由一个线程拥有,对象被封闭在该线程中,并且只能由这个线程修改。

只读共享:

在没有额外同步情况下,共享的只读对象可以由多个线程并发访问,但任何线程都不能修改它。包括不可变对象和事实不可变对象。

线程安全共享:

线程安全的对象在其内部实现同步,因此多个线程可以通过对象的公有接口进行访问而不需要进一步的同步。

保护对象:

被保护对象只能通过持有特点锁来访问。保护对象包括封装在其他线程安全对象中的对象,比如SynchronizedMap中的对象,以及已发布的并且由某个特定锁保护的对象。

 

本人博客已搬家,新地址为:http://yidao620c.github.io/

分享到:
评论

相关推荐

    Java并发编程实战

    第3章 对象的共享 3.1 可见性 3.1.1 失效数据 3.1.2 非原子的64位操作 3.1.3 加锁与可见性 3.1.4 Volatile变量 3.2 发布与逸出 3.3 线程封闭 3.3.1 Ad-hoc线程封闭 3.3.2 栈封闭 3.3.3 ThreadLocal类 ...

    JAVA 并发编程实战

    Java并发编程实战,本书从线程的基础知识,包括线程安全性,对象共享以及对象组合灯,到结构化并发编程,都提供了很详细的讲解。

    Java并发编程的艺术.md

    《Java并发编程的艺术》笔记 第一章 并发编程的挑战 第二章 Java并发机制的底层实现原理 volatile的两条实现原则: 1. Lock前缀指令会引起处理器缓存回写到内存 2. 一个处理器的缓存回写到内存会导致其他...

    《java并发编程实战》读书笔记-第3章-对象的共享

    《java并发编程实战》读书笔记-第3章-对象的共享,脑图形式,使用xmind8制作 包括可见性、发布与逸出、线程封闭、不可变性、安全发布等内容

    Java 并发编程实战

    第3章 对象的共享 3.1 可见性 3.1.1 失效数据 3.1.2 非原子的64位操作 3.1.3 加锁与可见性 3.1.4 Volatile变量 3.2 发布与逸出 3.3 线程封闭 3.3.1 Ad-hoc线程封闭 3.3.2 栈封闭 3.3.3 ThreadLocal类 3.4...

    Java并发编程实践 PDF 高清版

    本书的读者是那些具有一定Java编程经验的程序员、希望了解Java SE 5,6在线程技术上的改进和新特性的程序员,以及Java和并发编程的爱好者。 目录 代码清单 序 第1章 介绍 1.1 并发的(非常)简短历史 1.2 线程的...

    java并发编程理论基础精讲

    本资源为您提供了关于 Java 并发编程理论基础的精讲,涵盖了多线程编程的核心概念、基本原理以及在 Java 中的应用。通过深入学习,您将建立坚实的并发编程基础,能够更好地理解和应对多线程编程中的挑战。 并发编程...

    java并发编程:juc、aqs

    Java 并发编程中的 JUC(java.util.concurrent)库以及其核心组件 AQS(AbstractQueuedSynchronizer)在构建高性能、可伸缩性的多线程应用方面具有重要的地位。 AQS 是 JUC 中的核心组件,它提供了一个框架,让...

    Java并发编程实战2019.zip

    Java并发编程实战,第1章 简介,第2章 线程安全性 第3章 对象的共享 第4章 对象的组合 第5章 基础构建模块 第6章 任务执行 第7章 取消与关闭 第8章 线程池的使用 第9章 图形用户界面应用程序 第10章 避免...

    Java 并发编程实战_2012

    【描述】Java 并发编程实战_2012,主J要讲解并发编程相关的知识点,Java中的多线程部分以及并发处理的相关内容。 【版权声明】该资源应用与共享和交流学习,不作它用。如有侵权,请联系删除 【资源说明】改版后不能...

    java并发编程:线程基础

    本资源致力于向您介绍 Java 并发编程中的线程基础,涵盖了多线程编程的核心概念、线程的创建和管理,以及线程间通信的基本方法。通过深入学习,您将建立扎实的多线程编程基础,能够更好地理解和应用多线程编程。 多...

    Java并发编程实战-读书笔记

    《Java并发编程实战》个人读书笔记,非常详细: 1 简介 2 线程安全性 3 对象的共享 4 对象的组合 5 基础构建模块 6 任务执行 7 取消与关闭 8 线程池的使用 9 图形用户界面应用程序 10 避免活跃性危险 11 性能与可...

    《java并发编程实战》读书笔记-第4章-对象的组合

    《java并发编程实战》读书笔记-第3章-对象的共享,脑图形式,使用xmind8制作 包括线程安全类设计、实例封闭、线程安全性委托、现有线程安全类中添加功能和文档化同步策略等内容

    Java并发编程基础.pdf

    Java并发编程基础主要包括以下几个核心方面: 线程与线程状态:理解Java中线程的基本概念,包括线程的创建、启动、暂停、恢复和终止。熟悉线程的生命周期及其不同状态,如新建、就绪、运行、阻塞和死亡。 线程同步...

    并发编程实践,全面介绍基础知识、JVM同步原语、线程安全、低级并发工具、线程安全容器、高级线程协作工具、Executor部分等

    详细介绍java并发编程相关知识: 基础知识   并发与并行   Java并发演进历史   Java并发模型   线程模型   存储模型 JVM同步原语 volatile CAS 线程安全   保护“共享数据” 低级并发工具   原子变量   锁...

    java+并发编程实战+资源合集

    Java并发编程是基于多线程技术的一种编程技术,该技术是为了解决资源利用率、响应速度、线程安全而创建的,能极大的提高程序的运行效率。JUC是指java.util.concurrent这个jdk自带的包的简称,这个包下有Java5发布的...

    Java高并发编程详解:多线程与架构设计 (Java核心技术系列)

    第三部分详细、深入地介绍volatile关键字的语义,volatile关键字在Java中非常重要,可以说它奠定了Java核心并发包的高效运行,在这一部分中,我们通过实例展示了如何使用volatile关键字以及非常详细地介绍了Java内存...

    Java并发编程(学习笔记).xmind

    Java并发编程 背景介绍 并发历史 必要性 进程 资源分配的最小单位 线程 CPU调度的最小单位 线程的优势 (1)如果设计正确,多线程程序可以通过提高处理器资源的利用率来提升系统吞吐率 ...

Global site tag (gtag.js) - Google Analytics