TA的博客

157

AQS概述AQS是AbstractQueuedSynchorinizer的简写,中文名是队列同步器。AQS是Java实现阻塞式锁和同步工具的基石。它使用一个int类型的成员变量state表示同步状态,通过内置的一个FIFO队列完成线程的排队工作。AQS是一个抽象类,主要是通过继承的方式来使用,它本身没有实现任何的同步接口,仅仅是定义了同步状态的获取以及释放的方法来提供自定义的同步组件。一、A...

如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?在Java中可以通过线程池来达到这样的效果。今天我们就来详细讲解一下Java的线程池,首先我们从最核心的ThreadPoolExecutor类中的方法...

前言​Unsafe为我们提供了访问底层的机制,这种机制仅供java核心类库使用,而不应该被普通用户使用。其实例一般情况是获取不到的,源码中的设计是采用单例模式,不是启动类加载器加载初始化就会抛SecurityException异常。​这个类的提供了一些绕开JVM的更底层功能,基于它的实现可以提高效率。但是,它是一把双刃剑:正如它的名字所预示的那样,它是不安全的,它所分配的内存需要手动free...

高性能原子类是java8中增加的原子类,它们使用分段的思想(Cell[]),把不同的线程hash到不同的段上去更新,最后再把这些段的值相加得到最终的值,相对Atomic类这些类运行性能更高,这些类主要有:(1)Striped64:下面四个类的父类。(2)LongAccumulator:long类型的聚合器,需要传入一个long类型的二元操作,可以用来计算各种聚合操作,包括加减乘除模。(3)L...

AtomicStampedReference是Java提出的一个原子类,它可以解决ABA问题。与这个类有同样作用的类是AtomicMarkableReference,他们都可以解决CAS的ABA问题。一、什么是ABA问题?ABA的危害?ABA问题发生在多线程环境下,说的是当线程A对一个变量使用CAS修改的时候,他两次读到内存地址V中的值一样,然后改线程就简单的认为变量没有发生过修改。然而,同...

AtomicInteger是java并发包下面提供的原子类,主要操作的是int类型的数值,通过调用底层Unsafe的CAS等方法实现原子操作。源码分析一、主要属性(1)unsafe:Unsafe类的实例(2)value:使用int类型的value存储值,且使用volatile修饰,volatile主要是保证可见性,即一个线程修改对另一个线程立即可见(2)valueOffset:用于保存字段v...

一、什么是CAS?CAS(CompareAndSweap或者CompareAndSet,比较替换),CAS和volatile的读写共同支撑起了整合JUC包。工作原理是:一个CAS操作有三个操作数,目标内存地址V,旧的预期值E和将要替换的新值B,在进行替换操作前比较当且仅当目标内存地址V中的值和旧的预期值E值相等的时候才会发生替换,否则什么都不做。CAS是乐观锁技术,当多个线程尝试使用CAS同...

先给出结论:volatile可以保证不同线程对一个变量的可见性,即一个线程修改了被voaltile修饰的变量后,这新值对其他线程来说是立即可见的;volatile可以禁止指令重排序,保证了有序性;volatile不能保证原子性,更加不能保证线程安全,要想保证原子性和线程安全还是乖乖的使用锁吧!具体的原理且看我慢慢分析。一、Java内存模型JMM即JavaMemoryModel,它将JVM内存...

与Object的wait()/notify()相比:wait()、notify()、notifyAll()都必须配置Objectmonitor使用,而LockSupport的park()、unpark()方法不必park()、unpark()可以精确到一个线程来阻塞和唤醒它,但是notify()只能在WaitSet中随机唤醒一个,并且notifyAll()也只能是唤醒所有的线程,控制精度不及...

一、什么是等待/通知机制?等待/通知机制就是一个【线程A】等待,一个【线程B】通知(线程A可以不用再等待了)。比如生产者和消费者模型,消费者等待生产者生产资源,这是等待,生产者生产好资源通知等待的消费者去消费,这是通知。等待/通知的相关方法是任意Java对象都具备的,因为这些方法被定义在java.lang.Object类中注意!(1)notify()或notifyAll()在调用之后,等待线...