带你了解java的JUC的使用

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;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值