随笔分类 - Java并发编程
摘要:1.简介 在JDK1.6中的java.util.concurrent的子包locks中引了LockSupport这个API,LockSupport是一个比较底层的工具类,用来创建锁和其他同步工具类的基本线程阻塞原语。java锁和同步器框架的核心 AQS: AbstractQueuedSynchron
阅读全文
摘要:1.概念 读写锁的概念其实就是共享锁和排他锁,读锁就是共享锁,写锁就是排他锁。 2.使用 import java.util.Random; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWr
阅读全文
摘要:1.概念 Exchanger用于线程间进行通信、数据交换。Exchanger提供了一个同步点exchange方法,两个线程调用exchange方法时,无论调用时间先后,两个线程会互相等到线程到达exchange方法调用点,此时两个线程可以交换数据,将本线程产出数据传递给对方。 2.使用 import
阅读全文
摘要:1.概念 Phaser它就像是结合了CountDownLatch和CyclicBarrier,翻译一下叫阶段。Phaser是按照不同的阶段来对线程进行执行,就是它本身是维护着一个阶段这样的一个成员变量,当前我是执行到哪个阶段,是第0个,还是第1个阶段啊等等,每个阶段不同的时候这个线程都可以往前走,有
阅读全文
摘要:1.概念 Semaphore是计数信号量。Semaphore管理一系列许可。每个acquire方法阻塞,直到有一个许可证可以获得然后拿走一个许可证;每个release方法增加一个许可,这可能会释放一个阻塞的acquire方法。然而,其实并没有实际的许可这个对象,Semaphore只是维持了一个可获得
阅读全文
摘要:1.概念 循环栅栏,一个可循环利用的屏障,它的作用就是会让所有线程都等待完成后才会继续下一步行动。举个例子,就像生活中我们会约朋友们到某个餐厅一起吃饭,有些朋友可能会早到,有些朋友可能会晚到,但是这个餐厅规定必须等到所有人到齐之后才会让我们进去。这里的朋友们就是各个线程,餐厅就是 CyclicBar
阅读全文
摘要:1.ReentrantLock简介 JDK中独占锁的实现除了使用关键字synchronized外还可以使用ReentrantLock。虽然在性能上ReentrantLock和synchronized没有什么区别,但ReentrantLock相比synchronized而言功能更加丰富,使用起来更为灵
阅读全文
摘要:1.概念 CountDownLatch是一个同步工具类,用来协调多个线程之间的同步,或者说起到线程之间的通信(而不是用作互斥的作用)。 CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。每一个线程完成自己任务后
阅读全文
摘要:1.LongAdder简介 LongAdder效率高的原因 LongAdder的内部做了一个分段锁,类似于分段锁的概念。在它内部的时候,会把一个值放到一个数组里,比如说数组长度是4,最开始是0,1000个线程,250个线程锁在第一个数租元素里,以此类推,每一个都往上递增算出来结果在加到一起。
阅读全文
摘要:1.Java中的8大原子操作 lock:主内存,标识变量为线程独占 unlock:主内存,解锁线程独占变量 read:主内存,读取内存到线程缓存(工作内存) load:工作内存,read后的值放入线程本地变量副本 use:工作内存,传值给执行引擎 assign:工作内存,执行引擎结果赋值给线程本地变
阅读全文
摘要:1. 基本原理 CAS(Compare-And-Swap)指令是并行程序设计最基础的基石。 有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。CAS是一种典型的乐观锁, 假设不会发生并发冲突,只在提交操作时检查是否违反数据完整
阅读全文
摘要:1.synchronized用法 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象 修改一个静态的方法,其作用的范围是整个静态方法,作用
阅读全文
摘要:1. 前言 Unsafe是位于sun.misc包下的一个类,主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,这些方法在提升Java运行效率、增强Java语言底层资源操作能力方面起到了很大的作用。但由于Unsafe类使Java语言拥有了类似C语言指针一样操作内
阅读全文
摘要:1.JMM内存模型 JMM结构规范 JMM规定了所有的变量都存储在主内存(Main Memory)中。每个线程还有自己的工作内存(Working Memory),线程的工作内存中保存了该线程使用到的变量的主内存的副本拷贝。 线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读写主
阅读全文
摘要:1.线程的中断(interrupt) public void interrupt() //t.interrupt() 打断t线程(设置t线程某给标志位f=true,并不是打断线程的运行) public boolean isInterrupted() //t.isInterrupted() 查询打断标
阅读全文
摘要:1. 线程的6种状态 1.初始(NEW):新创建了一个线程对象,但还没有调用start()方法。 2.运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态
阅读全文
摘要:1. MarkWord详解 以上是Java对象处于5种不同状态时,Mark Word的表现形式,上面每一行代表对象处于某种状态时的样子。其中各部分的含义如下: lock:2位的锁状态标记位,由于希望用尽可能少的二进制位表示尽可能多的信息,所以设置了lock标记。该标记的值不同,整个Mark Word
阅读全文
摘要:1.volatile的特性 1.多线程之间可见性 2.禁止指令重排序 volatile修饰的内存,不可以重排序,对volatile修饰变量的读写访问,都不可以换顺序 2. volatile和锁的内存语义 从内存语义的角度来说,volatile的写-读与锁的释放-获取有相同的内存效果:volatile
阅读全文
摘要:1. 重排序 在执行程序时为了提高性能,编译器和处理器常常会对指令做重排序。重排序分三种类型 1.编译器优化的重排序。编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。 2.指令级并行的重排序。现代处理器采用了指令级并行技术(Instruction-Level Parallelism
阅读全文