并发编程 20—— 原子变量和非阻塞同步机制

并发编程 01—— ConcurrentHashMap

并发编程 02—— 阻塞队列和生产者-消费者模式

并发编程 03—— 闭锁CountDownLatch 与 栅栏CyclicBarrier

并发编程 04—— Callable和Future

并发编程 05—— CompletionService : Executor 和 BlockingQueue

并发编程 06—— 任务取消

并发编程 07—— 任务取消 之 中断

并发编程 08—— 任务取消 之 停止基于线程的服务

并发编程 09—— 任务取消 之 关闭 ExecutorService

并发编程 10—— 任务取消 之 “毒丸”对象

并发编程 11—— 任务取消与关闭 之 shutdownNow 的局限性

并发编程 12—— 线程池的使用 之 配置ThreadPoolExecutor 和 饱和策略

并发编程 13—— 线程池 之 整体架构

并发编程 14—— 线程池 之 原理一

并发编程 15—— 线程池 之 原理二

并发编程 16—— Lock

并发编程 17—— 使用内置条件队列实现简单的有界缓存

并发编程 18—— 显式的Conditon 对象

并发编程 19—— AbstractQueuedSynchronizer 深入分析

并发编程 20—— 原子变量和非阻塞同步机制

概述

第1部分 锁的劣势

第2部分

参考

第1部分 锁的劣势

  java传统上是使用锁来实现线程间的同步。每一个object都有一个内部锁(intrinsic lock),关键字synchronized实现了锁的互斥。方法Object.wait主动的放弃锁,而方法Object.notify(All)则用来唤醒waiting中的线程。使用synchronized确保线程同步的正确性,但是也容易造成线程的阻塞。

  volatile变量与锁相比是更轻量级的同步机制,但仅仅能保证内存的可见性,而不能用于原子化的操作。++i 看起来是原子的,而实际上却是取当前值,自增加一,然后回写更新。

时间: 2024-10-12 08:08:30

并发编程 20—— 原子变量和非阻塞同步机制的相关文章

java并发编程11.原子变量与非阻塞同步机制

在非阻塞算法中不存在死锁和其他活跃性问题. 在基于锁的算法中,如果一个线程在休眠或自旋的同时持有一个锁,那么其他线程都无法执行下去,而非阻塞算法不会受到单个线程失败的影响. 锁的劣势 许多JVM都对非竞争锁获取和释放操作进行了极大的优化,但如果有多个线程同时请求锁,那么JVM就需要借助操作系统地功能.如果出现了这种情况,那么一些线程将被挂起并且在稍后恢复运行.当线程恢复执行时,必须等待其他线程执行完它们的时间片以后,才能被调度执行.在挂起和恢复线程等过程中存在着很大的开销,并且通常存在着较大时间

多线程并发编程之原子变量与非阻塞同步机制

1.非阻塞算法 非阻塞算法属于并发算法,它们可以安全地派生它们的线程,不通过锁定派生,而是通过低级的原子性的硬件原生形式 —— 例如比较和交换.非阻塞算法的设计与实现极为困难,但是它们能够提供更好的吞吐率,对生存问题(例如死锁和优先级反转)也能提供更好的防御.使用底层的原子化机器指令取代锁,比如比较并交换(CAS,compare-and-swap). 2.悲观技术 独占锁是一种悲观的技术.它假设最坏的情况发生(如果不加锁,其它线程会破坏对象状态),即使没有发生最坏的情况,仍然用锁保护对象状态.

《Java并发编程实战》第十五章 原子变量与非阻塞同步机制 读书笔记

一.锁的劣势 锁定后如果未释放,再次请求锁时会造成阻塞,多线程调度通常遇到阻塞会进行上下文切换,造成更多的开销. 在挂起与恢复线程等过程中存在着很大的开销,并且通常存在着较长时间的中断. 锁可能导致优先级反转,即使较高优先级的线程可以抢先执行,但仍然需要等待锁被释放,从而导致它的优先级会降至低优先级线程的级别. 二.硬件对并发的支持 处理器填写了一些特殊指令,例如:比较并交换.关联加载/条件存储. 1 比较并交换 CAS的含义是:"我认为V的值应该为A,如果是,那么将V的值更新为B,否则不需要修

Java并发编程实战 第15章 原子变量和非阻塞同步机制

非阻塞的同步机制 简单的说,那就是又要实现同步,又不使用锁. 与基于锁的方案相比,非阻塞算法的实现要麻烦的多,但是它的可伸缩性和活跃性上拥有巨大的优势. 实现非阻塞算法的常见方法就是使用volatile语义和原子变量. 硬件对并发的支持 原子变量的产生主要是处理器的支持,最重要的是大多数处理器架构都支持的CAS(比较并交换)指令. 模拟实现AtomicInteger的++操作 首先我们模拟处理器的CAS语法,之所以说模拟,是因为CAS在处理器中是原子操作直接支持的.不需要加锁. public s

第十五章 原子变量和非阻塞同步机制

1.非阻塞算法 如果在算法中,一个线程的失败或挂起不会导致其他线程也失败或挂起,那么这种算法就称为非阻塞算法.如果这种算法的每个步骤中都存在某个线程能够执行下去,那么这种算法也称为无锁算法. 这种算法利用底层的原子机器指令代替锁来确保数据在并发访问中的一致性. 2.硬件对并发的支持 2.1 CAS(Compare-and-Swap) 包含3个操作数--需要读写的内存位置.进行比较的值A和拟写入的新值B.当且仅当V的值等于A时,CAS才会通过原子的方式用新值B更新V的值.无论位置V的值是否等于A,

java并发编程(8)原子变量和非阻塞的同步机制

原子变量和非阻塞的同步机制 一.锁的劣势 1.在多线程下:锁的挂起和恢复等过程存在着很大的开销(及时现代的jvm会判断何时使用挂起,何时自旋等待) 2.volatile:轻量级别的同步机制,但是不能用于构建原子复合操作 因此:需要有一种方式,在管理线程之间的竞争时有一种粒度更细的方式,类似与volatile的机制,同时还要支持原子更新操作 二.CAS 独占锁是一种悲观的技术--它假设最坏的情况,所以每个线程是独占的 而CAS比较并交换:compareAndSwap/Set(A,B):我们认为内存

非阻塞同步机制和CAS

目录 什么是非阻塞同步 悲观锁和乐观锁 CAS 我们知道在java 5之前同步是通过Synchronized关键字来实现的,在java 5之后,java.util.concurrent包里面添加了很多性能更加强大的同步类.这些强大的类中很多都实现了非阻塞的同步机制从而帮助其提升性能. 什么是非阻塞同步 非阻塞同步的意思是多个线程在竞争相同的数据时候不会发生阻塞,从而能够在更加细粒度的维度上进行协调,从而极大的减少线程调度的开销,从而提升效率.非阻塞算法不存在锁的机制也就不存在死锁的问题. 在基于

Java并发编程-非阻塞同步方式原子类(Atomic)的使用

非阻塞同步 在大多数情况下,我们为了实现线程安全都会使用Synchronized或lock来加锁进行线程的互斥同步,但互斥同步的最主要的问题就是进行线程的阻塞和唤醒所带来的性能问题,因此这种阻塞也称作阻塞同步.从处理问题的方式上说,互斥同步属于一种悲观的并发策略,总是认为只要不去做正确的同步措施,那就肯定会出现问题,无论共享数据是否真的会出现竞争,它都会进行加锁.用户态核心态转换.维护锁的计数器和检查是否有被阻塞的线程需要被唤醒等操作. 随着硬件指令集的发展,我们有了另一个选择:基于冲突检测的乐

讲一讲什么叫阻塞非阻塞同步异步

1.讲一讲什么叫阻塞非阻塞同步异步全是用来形容方法的,形容一个方法返回值状态的. 2.io读取,网络读取,jdbc读取,这些流的操作都是bio的,都是阻塞的. 3.所以沃恩一般在处理io操作时,都采用多线程来提高bio的效率. 4.io操作,就是本地文件,网络,数据嘛嘛.所以在这三种读取数据时,都要采用多线程提高效率. 5.多线程处理阻塞方法时,只不过是避免了主线程的阻塞,但是让子线程,也就是处理每个http request的线程去发生阻塞了. 6.传统的古老的开发方式: 单线程执行阻塞方法->