加锁机制既可以确保可见性又可以确保原子性,而volatile变量只能确保可见性。
当前仅当满足一下所有条件时,才应该使用volatile变量:
- 对变量的写入操作不依赖变量的当前值,或者你能确保只有单个线程更新变量的值。
- 该变量不会与其他状态变量一起纳入不变性条件中。
- 在访问变量时不需要加锁。
线程封闭:当访问共享的可变数据时,通常需要使用同步。一种避免使用同步的方式就是不共享数据。如果仅在单线程内访问数据,就不需要同步。这种技术被称为线程封闭(Thread Confinement).
Ad-hoc 线程封闭是指,维护线程封闭性的职责完全由程序实现来承担。
不可变对象
但满足以下条件时,对象才是不可变的:
- 对象创建以后其状态就不能修改。
- 对象的所有域都是final类型。
- 对象是正确创建的。
要安全地发布一个对象,对象的引用以及对象的状态必须同时对其他线程可见。一个正确构造的对象可以通过以下方式来安全地发布:
- 在静态初始化函数中初始化一个对象引用。
- 将对象的引用保存大volatile类型的域或者AtomicReference对象中。
- 将对象的引用保存到某个正确构造对象definal类型域中。
- 将对象的引用保存到一个由锁保护的域中。
在并发程序中使用和共享对象时,可以使用一些实用的策略,包括:
- 线程封闭。 线程封闭的对象只能由一个线程拥有,对象被封闭在该线程中,并且只能由这个线程修改。
- 只读共享。 在没有额外同步的情况下,共享的只读对象可以由多个线程并发访问,但任何线程都不能修改它。共享的只读对象包括不可变对象和事实不可变对象。
- 线程安全共享。 线程安全的对象在其内部实现同步,因此多个线程可以通过对象的共有接口来进行访问而不需要进一步的同步。
- 保护对象。 被保护的对象只能通过持有特定的锁来访问。保护对象包括封装在其他线程安全对象中的对象,以及已发布的并且由某个特定锁保护的对象。
分享到:
相关推荐
1. **Java基础** - **数据类型**: Java分为基本数据类型(如整型、浮点型、字符型、布尔型)和引用数据类型(类、接口、数组)。理解每种类型的特点和使用场景至关重要。 - **变量**: 变量是存储数据的地方,声明...
【Java狂神说笔记】是针对Java开发语言深入学习的一份综合笔记,涵盖了广泛的Java相关知识点,适合初学者和有一定经验的开发者进行提升。这份笔记的PDF版本详细讲解了Java的基础概念、进阶特性和实战应用,旨在帮助...
Java是一种广泛使用的面向对象的编程...通过系统学习和实践,初学者可以逐步掌握Java编程,为后续的软件开发和系统设计打下坚实的基础。在阅读笔记时,结合实际编写代码,不断练习和调试,是提升Java技能的最佳途径。
Java JDK 7是Java开发工具包的一个重要版本,它的全称是Java Development Kit,是用于构建和运行Java应用程序的关键组件。这个PDF学习笔记是开发者深入理解JDK 7特性和功能的重要参考资料。以下是对Java JDK 7的一些...
理解线程的并发执行、同步机制(如synchronized关键字和Lock接口)以及线程通信,对于开发高效并行程序非常重要。 九、反射与注解 反射机制允许在运行时动态地获取类的信息并操作类的对象。注解是一种元数据,用于...
反射机制在Java中的应用广泛,特别是在框架开发和各种底层API中。 类集框架是Java集合框架的简称,提供了表示和操作集合的接口和类。Java集合框架主要包括Collection接口和Map接口,以及它们的多个子接口和实现类。...
Java JDK 8是Java开发工具集的一个重要版本,它的发布带来了许多创新特性和改进,极大地提升了开发者的工作效率。本学习笔记旨在深入解析JDK 8的关键特性,帮助初学者快速掌握这一版本的核心知识。 1. **lambda...
标题“java8学习笔记”表明了这是一份关于Java 8版本的学习资料,Java 8是Java编程语言的一个重要版本,它在2014年发布,包含了许多新的特性,例如lambda表达式、新的日期时间API、Stream API、接口中的默认方法和...
Java中的线程是程序执行流的最小单位,提供并行计算的能力。Thread类用于表示线程,可以通过创建Thread类的子类或实现Runnable接口来创建线程。 JDK的安装和配置对于Java开发至关重要。路径(PATH)和类路径...
本笔记将深入探讨这两个区域的工作原理以及如何进行有效的分析。 首先,我们要理解Java内存的两个主要部分:堆(Heap)和栈(Stack)。堆主要用于存储对象实例,而栈则用于存储基本类型变量和对象引用。堆内存是...
《java jdk 7学习笔记》适合java的初中级读者,以及广大java应用开发人员。 作译者 林信良(网名:良葛格) 学历:台湾大学电机工程学系 经历:台湾升阳教育训练技术顾问、专业讲师,oracle授权训练中心讲师 ...
涵盖了Java的各个方面,包括但不限于IO流(模拟生活中的数据传输)、线程(如同生活中的并行任务)、网络编程(如互联网上的通信)以及Java的库和框架(如Spring框架在软件开发中的角色,就像生活中的基础设施,简化...
Java大数据课程核心笔记是针对那些想要深入理解和应用Java在大数据领域的开发者所准备的宝贵资源。这份笔记涵盖了Java的基础以及在大数据处理中的应用,适合不同层次的学习者,无论你是初入编程殿堂的新手,还是有着...
【Java高并发笔记】 在Java开发中,处理高并发场景是一项关键技能,涉及到多个核心概念。以下是关于同步、异步、并发、并行、临界区、阻塞、非阻塞以及死锁、饥饿和活锁的详细解释。 1. **同步与异步** - **同步*...
Java是世界上最流行的编程语言之一,尤其在企业级应用开发中占据主导地位。这份"随时更新-小白实习生的Java学习笔记.rar"压缩包包含了实习生在学习Java过程中积累的知识点,主要涵盖了Java的基础、数据库操作、多...
在Java JDK 8中,引入了一系列重大更新,极大地提升了开发效率和代码的可读性。首先,书中会详细讲解Lambda表达式,这是Java 8的核心特性之一。Lambda允许将匿名函数作为方法参数传递,简化了多线程编程和事件处理,...
Java 8是Java语言发展的一个重要里程碑,引入了许多创新性的特性和改进,极大地提升了开发效率和代码质量。本文将深入探讨Java 8的三大关键新特性:接口的默认方法实现、Lambda表达式以及一系列相关的变化。 一、...
在过去单核CPU时代,单任务在一个时间点只能执行单一程序,随着多核CPU的发展,并行程序开发就显得尤为重要。 《实战Java高并发程序设计》主要介绍基于Java的并行程序设计基础、思路、方法和实战。第一,立足于...
Java JDK 7(Java Development Kit 7)是Java编程语言的一个重要版本,由Sun Microsystems(后被Oracle公司收购)开发,并于2011年7月28日正式发布。这个版本引入了一系列新特性、改进和优化,旨在提升开发者的工作...