多线程
striveb
趁年轻,多吃点苦吧
展开
-
java内存模型之重排序和顺序一致性
1 Java内存模型的基础1.1 并发编程模型的两个关键问题在并发编程中,需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。在共享内存的并发模型里,线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信。在消息传递的并发模型里,...原创 2019-01-26 22:26:34 · 711 阅读 · 0 评论 -
java内存模型之volatile和锁的内存语义
1.volatile的内存语义1.1 volatile的特性可以把对volatile变量的单个读/写,看成是使用同一个锁对这些单个读/写操作做了同步。如下面的例子:class VolatileFeaturesExample { volatile long vl = 0L; // 使用volatile声明64位的long型变量 public void set(long l) { ...原创 2019-01-26 22:33:52 · 260 阅读 · 0 评论 -
Java内存模型之final的内存语义和happens-before
一、final域的内存语义1 final域的重排序规则对于final域,编译器和处理器要遵守两个重排序规则:1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。(即对构造函数的写入要在这个对象被其他线程看到之后)2)初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。p...原创 2019-01-26 22:36:31 · 655 阅读 · 0 评论 -
java内存模型之双重检测锁和延迟初始化
1 双重检查锁定及其存在的问题在单例模式中,普通的单例模式是线程不安全的,如下://懒汉式,线程不安全public static class SingleTon2 { public static SingleTon2 instance = null; private SingleTon2() { } public static SingleTon2 ...原创 2019-01-26 22:38:09 · 231 阅读 · 0 评论 -
AQS组件之CountDownLatch
GitHub:https://github.com/JDawnF一、CountDownLatch简介CountDownLatch是一个同步工具类,用来协调多个线程之间的同步。这个工具通常用来控制线程等待,它可以让某一个线程等待直到倒计时结束,再开始执行。通过一个计数来保证线程是否需要被阻塞。实现一个或多个线程等待其他线程执行的场景。我们定义一个CountDownLatch,通过...原创 2019-02-03 22:42:52 · 362 阅读 · 0 评论 -
什么是AQS及其原理
GitHub:https://github.com/JDawnF1、AQS简介AQS全名:AbstractQueuedSynchronizer,是并发容器J.U.C(java.lang.concurrent)下locks包内的一个类。它实现了一个FIFO(FirstIn、FisrtOut先进先出)的队列。底层实现的数据结构是一个双向链表。Sync queue:同步队列,是一个双向链...原创 2019-02-03 23:49:59 · 47316 阅读 · 7 评论 -
AQS组件之Semaphore
在前两篇说了AQS和CountDownLatch,现在我们来看看Semaphore。synchronized 和 ReentrantLock 都是一次只允许一个线程访问某个资源,Semaphore(信号量)可以指定多个线程同时访问某个资源。 用于保证同一时间并发访问线程的数目。信号量在操作系统中是很重要的概念,Java并发库里的Semaphore就可以很轻松的完成类似操作系统信号量的控制...原创 2019-02-05 22:20:24 · 218 阅读 · 0 评论 -
多线程之阻塞队列
一、概述阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法。1)支持阻塞的插入方法:意思是当队列满时,队列会阻塞插入元素的线程,直到队列不满。2)支持阻塞的移除方法:意思是在队列为空时,获取元素的线程会等待队列变为非空。 阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的...原创 2019-02-10 17:45:58 · 947 阅读 · 0 评论