Java多线程
文章平均质量分 88
Adrian_Dai
学习永无止境,多读书才能有所提升
展开
-
volatile关键字详解
volatile关键字简介 volatile 关键字可以说是 Java 虚拟机提供的最轻量级的同步机制了 volatile 通过实现 内存可见性 和 禁止重排序 来解决并发问题,但是volatile关键字**不保证并发原子性**内存可见性可见性是指:当一个线程修改了共享变量的值,其它线程能立即感知到这种变化JMM 规定:volatile 变量的每次修改都必须立即回写到主内存中写一个 volatile 属性会立即刷入到主内存在对 volatile 修饰的变量进行写操作原创 2021-05-04 00:33:10 · 935 阅读 · 0 评论 -
线程状态
线程的6种状态初始(NEW):新创建了一个线程对象,但还没有调用 start()方法运行(RUNNABLE):Java 线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”线程对象创建后,其他线程(比如main线程)调用了该对象的 start() 方法该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)就...原创 2019-10-13 09:51:25 · 171 阅读 · 0 评论 -
Thread.join()详解
Thread.join()详解public final synchronized void join(long millis) throws InterruptedException { long base = System.currentTimeMillis(); long now = 0; if (millis < 0) { ...原创 2019-10-03 16:40:27 · 2709 阅读 · 0 评论 -
Java之并发三问题
转载自:https://javadoop.com/post/java-memory-model#toc101. 重排序请先运行下面的代码public class Test { private static int x = 0, y = 0; private static int a = 0, b =0; public static void main(String[]...转载 2018-05-03 14:52:06 · 300 阅读 · 0 评论 -
重入锁的理解
可重入锁(以下解释来自博客 http://http://blog.csdn.net/joker_apple/article/details/52790181)所谓重入锁,指的是以线程为单位,当一个线程获取对象锁之后,这个线程可以再次获取本对象上的锁,而其他的线程是不可以的 synchronized 和 ReentrantLock 都是可重入锁 可重入锁的意义在于防止死锁 实现原理实现是通过为每...转载 2018-03-14 09:44:27 · 469 阅读 · 0 评论 -
吞吐量
吞吐量:指一次性能测试过程中网络上传输的数据量的总和。在看AQS源码的时候,在ReentrantLock的内部类中有公平锁和非公平锁两个内部类。这两个内部类是实现lock方法的基础,这两个中,非公平锁的吞吐量比较大,性能会相对占优想了一下吞吐量较大的原因:是非公平锁在lock方法时先CAS获取锁,还有就是非公平锁不会去查看阻塞队列中是否会有线程在等待锁。...原创 2018-03-23 11:06:33 · 1481 阅读 · 0 评论 -
对CAS算法的简单理解
在了解和看AbstractQueuedSynchronizer的源码时,经常出现了compareAndSetHead和compareAndSetTail,这两个方法底层都是调用了unsafe.compareAndSwapObject(this, valueOffset, expect, update);这个方法是主要是利用了CPU的CAS指令,即是CAS算法。 该方法的主要逻辑是if (this ...原创 2018-03-18 22:04:32 · 361 阅读 · 0 评论 -
CAS算法和ThreadLocal
CAS操作是一种乐观锁技术,是指在操作数据之前先判断数据是否修改过(通过预期值与内存值比较是否相等来判断),只有当数据没被修改过的时候,才写入数据;注意CAS操作存在ABA问题,即A被修改为B又被修改为A,导致无法判断A是否变化过,解决该问题可以通过引入版本号等手段ThreadLocal类及应用技巧JDK1.5提供了ThreadLocal类来方便实现线程范围内的数据共享。 每个线程调用全局Thre...原创 2018-03-04 18:29:46 · 565 阅读 · 0 评论 -
线程创建的四种方式
创建线程方式方式一、创建一个任务类实现Runnable接口,并将其具体对象提交给Thread构造器创建一个发射类LiftOff实现Runnable接口:package concurrency;public class LiftOff implements Runnable { protected int countDown = 10; // Default private st...转载 2018-03-06 10:00:23 · 694 阅读 · 0 评论