J.U.C包内的原子操作封装类
-
AtomicBoolean:原子更新布尔类型
-
AtomicInteger:原子更新整型
-
AtomicLong:原子更新长整型
-
AtomicIntegerArray:原子更新整型数组里的元素
-
AtomicLongArray:原子更新长整型数组里的元素
-
AtoimcReferenceArray:原子更新引用类型数组里的元素
-
AtomicIntegerFieldUpdater:原子更新整型的字段的更新器
-
AtomicLongFieldUpdater:原子更新长整型字段的更新器
-
AtomicReferenceFieldUpdater:原子更新引用类型里的字段
-
AtomicReference:原子更新引用类型
-
AtomicStampedReference:原子更新带有版本号的引用类型(可用于解决ABA问题)
-
AtomicMarkableReference:原子更新带有标记的引用类型
1.8更新
计数器增强版,高并发下性能更好
更新器:DoubleAccumulator,LongAccumulator
计数器:DoubleAdder,LongAdder
原理:分成多个操作单元,不同线程更新不同的单元只有需要汇总的时候才计算所有单元的操作
场景:高并发频繁更新,不太频繁读的取的
Semaphore
/**
*
*/
public class SemaphoreDemo {
// Semaphore 信号量 限流 共享锁
private static Semaphore semaphore=new Semaphore(6);
public static void main(String[] args) {
for (int i = 0; i <1000 ; i++) {
new Thread(()->{
try {
semaphore.acquire(1);
System.out.println("线程正在执行===============================");
Thread.sleep(2000L);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
semaphore.release(1);
}
}).start();
}
}
}
手写Semaphore
package cn.tk.myproject.lock;
import java.util.concurrent.locks.AbstractQueuedSynchronizer;
public class MySemaphore {
private Sync sync;
public MySemaphore(int permit ) {
this.sync=new Sync(permit);
}
public void acquire(int arg){
sync.acquireShared(arg);
}
public void release(int arg){
sync.releaseShared(arg);
}
class Sync extends AbstractQueuedSynchronizer {
private int permit;
public Sync(int permit) {
this.permit = permit;
}
@Override
protected int tryAcquireShared(int arg) {
for (;;) {
int state = getState();
int next = state + arg;
if (next <= permit) {
//可以获取锁
if (compareAndSetState(state, next)) {
return arg;
}
}
}
}
@Override
protected boolean tryReleaseShared(int arg) {
for (;;){
int state = getState();
if(state==0){
return false;
}
if(compareAndSetState(state,state-arg)){
return true;
}
return false;
}
}
}
}
CountDownLatch
import java.util.concurrent.CountDownLatch;
public class CountDownLatchDemo {
private static CountDownLatch countDownLatch=new CountDownLatch(4);
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 3; i++) {
new Thread(()->{
countDownLatch.countDown();
System.out.println("开始执行代码");
}).start();
}
Thread.sleep(2000L);
countDownLatch.await();
System.err.println("成功执行完毕");
}
}
用法2:
import java.util.concurrent.CountDownLatch;
public class CountDownLatchDemo {
private static CountDownLatch countDownLatch=new CountDownLatch(1);
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 6; i++) {
new Thread(()->{
try {
System.out.println("准备执行!!");
countDownLatch.await();
System.out.println("开始执行");
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
Thread.sleep(3000L);
countDownLatch.countDown();
}
}
手写CountDownLatch
package cn.tk.myproject.lock;
import java.util.concurrent.locks.AbstractQueuedSynchronizer;
/**
* 共享锁,从指定值开始下降
*/
public class MyCountDownLatch {
private final Sync sync;
public MyCountDownLatch(int count) {
this.sync=new Sync(count);
}
public void await(){
sync.acquireShared(1);
}
public void countDown(){
sync.releaseShared(1);
}
/**
* CountDownLatch就可以看做是一个共享锁
* 初始状态,这个共享锁被获取了n次,
* 每次countdown,相当于释放一次锁
* 当锁释放完后,其他线程才能再次获得锁
*/
class Sync extends AbstractQueuedSynchronizer{
public Sync(int count) {
setState(count);
}
@Override
protected int tryAcquireShared(int arg) {
return (getState() == 0) ? 1 : -1;
}
@Override
protected boolean tryReleaseShared(int arg) {
for (;;) {
int c = getState();
if (c == 0)
return false;
int nextc = c-1;
if (compareAndSetState(c, nextc))
return nextc == 0;
}
}
}
}
CyclicBarrier
/**
* 需要线程数达到要求才会被执行
*/
public class CyclicBarrierDemo {
private static CyclicBarrier cyclicBarrier=new CyclicBarrier(4);
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 100; i++) {
new Thread(()->{
try {
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println("正在执行============================");
}).start();
Thread.sleep(300L);
}
}
}
CyclicBarrier源码分析
package cn.tk.myproject.lock;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class MyCyclecbarrier {
private ReentrantLock reentrantLock=new ReentrantLock();
private Condition condition=reentrantLock.newCondition();
private int count ;
private final int parties;
private Object gentation=new Object();
public MyCyclecbarrier(int parties) {
this.parties = parties;
this.count=this.parties;
}
public void await(){
final ReentrantLock lock =this.reentrantLock;
lock.lock();
try{
final Object g=gentation;
int index=--count;
if(index==0){
//结束等待
//唤醒等待队列
nextGention();
return;
}
//否则进入等待
for (;;){//防止伪唤醒
try {
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
if(g!=gentation){
return;
}
}
}finally {
lock.unlock();
}
}
private void nextGention() {
condition.signalAll();
count=parties;//重置数量
gentation=new Object();
}
}
FutureTask
package cn.tk.myproject.lock;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class CallableDemo {
public static void main(String[] args) throws ExecutionException, InterruptedException {
CallableImpl callable=new CallableImpl();
FutureTask<String> stringFutureTask = new FutureTask<>(callable);
new Thread(stringFutureTask).start();
// new Thread(stringFutureTask).start();
System.out.println(stringFutureTask.get());
System.out.println(stringFutureTask.get());
}
static class CallableImpl implements Callable<String> {
@Override
public String call() throws Exception {
System.out.println("执行callable");
return "操作成功";
}
}
}
FutureTask源码解析
package cn.tk.myproject.lock;
import java.util.concurrent.Callable;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.atomic.AtomicReference;
import java.util.concurrent.locks.LockSupport;
public class MyFutureTask<T> implements Runnable{
private static final int NEW=0;
private static final int RUNABLE=1;
private static final int END=2;
private int state;
private AtomicReference<Thread> ower=new AtomicReference<>(null);
private LinkedBlockingDeque<Thread> water=new LinkedBlockingDeque<>();
T result;
private final Callable<T> callabll;
public MyFutureTask(Callable<T> callabll) {
this.callabll = callabll;
state=NEW;
}
@Override
public void run() {
while (true){
if(state!=NEW||!ower.compareAndSet(null,Thread.currentThread())) return;
try {
state=RUNABLE;
result= callabll.call();
} catch (Exception e) {
e.printStackTrace();
}finally {
state=END;
ower.set(null);
}
while (true) {
Thread thread = water.poll();
if (thread == null) return;
LockSupport.unpark(thread);
}
}
}
public T get(){
if(state!=END){
//等待
water.add(Thread.currentThread());
LockSupport.park();
}
return result;
}
}