`

Concurrent - 线程安全

 
阅读更多

原创转载请注明出处:http://agilestyle.iteye.com/blog/2356901

 

什么叫线程安全?servlet是线程安全吗?

在多线程调用情况下,依然表现正常

不是

 

同步有几种实现方法?

锁和volatile 

 

volatile有什么用?能否用一句话说明下volatile的应用场景?

保持可见性,在1写N读的情况下比较适合 

 

请说明下java的内存模型及其工作流程。

http://agilestyle.iteye.com/blog/2275258 

 

为什么代码会重排序?

简单点说就是 —— 编译器旨在提升性能

内存模型描述了程序的可能行为。具体的编译器实现可以产生任意它喜欢的代码 —— 只要所有执行这些代码产生的结果,能够和内存模型预测的结果保持一致。这为编译器实现者提供了很大的自由,包括操作的重排序。

编译器生成指令的次序,可以不同于源代码所暗示的“显然”版本。重排序后的指令,对于优化执行以及成熟的全局寄存器分配算法的使用,都是大有脾益的,它使得程序在计算性能上有了很大的提升。

重排序类型包括:

  • 编译器生成指令的次序,可以不同于源代码所暗示的“显然”版本。
  • 处理器可以乱序或者并行的执行指令。
  • 缓存会改变写入提交到主内存的变量的次序。

http://tech.meituan.com/java-memory-reordering.html

 

简述Java内存模型的重排序、内存可见性、和 happens-before 关系

Java 语言的内存模型由一些规则组成,这些规则确定线程对内存的访问如何排序以及何时可以确保它们对线程是可见的。下面分别介绍 Java 内存模型的重排序,内存可见性和 happens-before 关系。

重排序

内存模型描述了程序的可能行为。具体的编译器实现可以产生任意它喜欢的代码 —— 只要所有执行这些代码产生的结果,能够和内存模型预测的结果保持一致。这为编译器实现者提供了很大的自由,包括操作的重排序。

编译器生成指令的次序,可以不同于源代码所暗示的“显然”版本。重排序后的指令,对于优化执行以及成熟的全局寄存器分配算法的使用,都是大有脾益的,它使得程序在计算性能上有了很大的提升。

重排序类型包括:

  • 编译器生成指令的次序,可以不同于源代码所暗示的“显然”版本。
  • 处理器可以乱序或者并行的执行指令。
  • 缓存会改变写入提交到主内存的变量的次序。

内存可见性

由于现代可共享内存的多处理器架构可能导致一个线程无法马上(甚至永远)看到另一个线程操作产生的结果。所以 Java 内存模型规定了 JVM 的一种最小保证:什么时候写入一个变量对其他线程可见。

在现代可共享内存的多处理器体系结构中每个处理器都有自己的缓存,并周期性的与主内存协调一致。假设线程 A 写入一个变量值 V,随后另一个线程 B 读取变量 V 的值,在下列情况下,线程 B 读取的值可能不是线程 A 写入的最新值:

  • 执行线程 A 的处理器把变量 V 缓存到寄存器中。
  • 执行线程 A 的处理器把变量 V 缓存到自己的缓存中,但还没有同步刷新到主内存中去。
  • 执行线程 B 的处理器的缓存中有变量 V 的旧值。

Happens-before 关系

happens-before 关系保证:如果线程 A 与线程 B 满足 happens-before 关系,则线程 A 执行动作的结果对于线程 B 是可见的。如果两个操作未按 happens-before 排序,JVM 将可以对他们任意重排序。

  1. 程序次序法则:如果在程序中,所有动作 A 出现在动作 B 之前,则线程中的每动作 A 都 happens-before 于该线程中的每一个动作 B。
  2. 监视器锁法则:对一个监视器的解锁 happens-before 于每个后续对同一监视器的加锁。
  3. Volatile 变量法则:对 Volatile 域的写入操作 happens-before 于每个后续对同一 Volatile 的读操作。
  4. 传递性:如果 A happens-before 于 B,且 B happens-before C,则 A happens-before C。
  5. 线程启动法则:在一个线程里,对Thread.start的调用会happens-before于每个启动线程的动作。
  6. 线程终结法则:线程中的任何动作都happens-before于其他线程检测到这个线程已经终结、或者从Thread.join调用中成功返回,或Thread.isAlive返回false。
  7. 中断法则:一个线程调用另一个线程的interrupt happens-before于被中断的线程发现中断。
  8. 终结法则:一个对象的构造函数的结束happens-before于这个对象finalizer的开始。
分享到:
评论

相关推荐

    concurrent-1.3.4-sources.jar

    这些类提供了在不使用synchronized关键字的情况下保证线程安全的更新操作,它们基于CAS(Compare and Swap)原语实现,提高了并发性能。 4. **java.util.concurrent.locks** 包:这个包提供了高级锁机制,包括...

    concurrent-map, go的线程安全并发映射.zip

    concurrent-map, go的线程安全并发映射 并发映射 这里解释了和这里的,go的map 类型不支持并发读和写。 concurrent-map 为这个提供了一个高性能解决方案,通过分割等待锁定的最小时间。go之前,在stdlib中没有并发...

    concurrent-all-in-one.pdf

    - 使用HashMap和ConcurrentHashMap构建缓存,线程安全。 - 结合FutureTask实现异步加载和缓存。 17. **CompletionService** - 提供一种方式,一旦任务完成,就获取并处理结果。 18. **线程服务的优雅停止** - ...

    atlassian-util-concurrent-0.0.12.jar.zip

    - **并发容器**:扩展了Java的并发集合,比如线程安全的队列和堆栈,这些容器在多线程环境下提供了高效的数据存储和访问。 - **执行器服务**:提供了一些预定义的ExecutorService实现,可以方便地启动和停止任务,...

    concurrent-1.3.4.jar

    并发控制:concurrent包提供了一些线程安全的集合类,如ConcurrentHashMap、ConcurrentLinkedQueue等,可以在多线程环境下安全地对集合进行操作,而无需手动添加同步机制。 原子操作:concurrent包提供了一些原子...

    backport-util-concurrent(2.2 /3.1)

    这个库的核心目标是为那些无法升级到Java 5或更高版本的系统提供线程安全和并发控制的解决方案。 1. **ReentrantLock与Condition** - ReentrantLock是backport-util-concurrent中的核心组件,它提供了与内置的...

    aduna-commons-concurrent-2.2.jar.zip

    4. **并发容器**:除了基础的并发工具,Aduna Commons Concurrent还提供了一些并发友好的容器,如ConcurrentHashMap、CopyOnWriteArrayList等,这些容器在多线程环境下能够保证操作的线程安全,减少了开发者对同步...

    aduna-commons-concurrent-2.6.0.jar.zip

    这个库可能提供了一组高级并发工具,包括线程池、同步机制、原子变量和其他并发控制结构,帮助开发者更安全、更高效地编写多线程程序。使用这样的库可以简化并发编程的复杂性,减少死锁、竞态条件和其他并发问题的...

    实战Concurrent-BlockQueue

    在Java并发编程领域,`Concurrent-BlockQueue`是一个重要的数据结构,它结合了线程安全与高效性能。本文将深入探讨`ConcurrentLinkedQueue`、`ArrayBlockingQueue`以及`LinkedBlockingQueue`这三种实现,并分析它们...

    开源项目-streamrail-concurrent-map.zip

    而通道则可以通过同步通信来避免竞态条件,实现线程安全的数据交换。 在“concurrent-map-master”目录下,我们可以找到项目的源代码、测试文件和其他相关文档。源代码通常会包含一个或多个Go文件(`.go`),这些...

    concurrent-1.3.2 connector.

    4. **并发容器**:如Java的`ConcurrentHashMap`和`CopyOnWriteArrayList`等,它们在设计时就考虑了并发访问,能提供线程安全的数据结构。 5. **异步编程**:通过回调、事件驱动或 futures/promise 模型,异步编程...

    aduna-commons-concurrent-2.5.0.jar.zip

    7. **线程安全的数据结构**:Aduna Commons Concurrent提供了一些线程安全的数据结构,如ConcurrentSkipListMap和ConcurrentSkipListSet,这些数据结构在多线程环境下能保持数据的一致性和完整性。 总之,"aduna-...

    Java多线程-线程安全问题练习题

    3. **原子操作类**:如`java.util.concurrent.atomic`包中的类,提供原子性操作,避免了线程安全问题。 4. **线程局部变量**:`ThreadLocal`类,为每个线程提供独立的变量副本,避免了共享状态的问题。 5. **并发...

    swift-Concurrent-函数式并发原语的集合

    为了有效地使用这些并发原语,我们需要理解Swift的内存模型和线程安全性。在并发环境中,确保数据一致性是非常重要的,我们可能需要使用锁、原子操作或`@mainActor`等同步机制来避免竞态条件和数据竞争。 总之,...

    JAVA并发编程实践-线程安全-学习笔记

    另外,Java的并发包`java.util.concurrent`引入了显式锁(如`Lock`接口及其实现类),以及原语操作(如Atomic类),这些都为开发者提供了更细粒度的控制,可以在不使用synchronized的情况下实现线程安全。...

    c# 线程安全队列的用法原理及使用示例

    什么是线程安全? 答:线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等...

    Java-concurrent-collections-concurrenthashmap-blockingqueue.pdf

    * 线程安全:ConcurrentHashMap 提供了线程安全机制,确保了在多线程环境中的数据安全。 * 无重复键:ConcurrentHashMap 不能包含重复的键,每个键只能映射到一个值。 * 高度优化的关联数组:ConcurrentHashMap 实现...

    Java并发编程-线程安全与基础构建模块

    本文将深入探讨"Java并发编程-线程安全与基础构建模块"这一主题,旨在帮助开发者理解如何有效地处理并发问题,提高程序性能和稳定性。 首先,线程安全是并发编程中的核心概念,指的是多个线程访问同一资源时,无论...

    PyPI 官网下载 | twitter.common.concurrent-0.3.1.tar.gz

    3. **锁和信号量**:提供线程安全的数据结构,如互斥锁(Mutex)、读写锁(RLock)、信号量(Semaphore),确保多线程访问共享资源时的正确性。 4. **未来对象(Future)**:允许程序提前安排计算任务,并在任务完成...

    示例2.5 线程异步-线程安全问题

    在IT行业中,线程安全和异步编程是两个至关重要的概念,尤其是在多线程环境下的Java应用程序中。本文将深入探讨这两个主题,并结合标题和描述,解析它们在实际开发中的应用与挑战。 线程安全指的是当多个线程访问同...

Global site tag (gtag.js) - Google Analytics