美文网首页
Java并发

Java并发

作者: Yves_Chen | 来源:发表于2020-05-12 23:33 被阅读0次

    Java并发

    Object

    wait&notify

    调用时必须拿到对象的锁

    synchronized(object)
    {
        object.wait();//object.notify()
    }
    

    调用wait()后,会自动释放锁,sleep不会释放锁。wait的线程被notify唤醒,会先重新获取对象锁再执行。

    Thread

    stop

    判断volatile标记

    interrupt

    void Thread.interrupt() 设置中断标记
    boolean Thread.isInterrupted() 判断是否中断
    boolean Thread.interrupted() 判断是否中断并清除标记
    中断和stop线程使用自定义volatile标记类似
    不同点,当线程sleep或wait时,自定义标记无法退出,但调用Thread.interrupt()会让sleep方法抛出InterruptedException并清除终端标记,程序可捕获该异常正常退出

    join

    等待线程执行完成后,主线程再执行

    while(isAlive())
    {
        wait(0);
    }
    

    本质上是通过wait notifyAll实现。

    yield

    ThreadGroup

    volatile

    synchronized

    不可重入

    Lock

    ReentrantLock

    重入锁
    公平锁
    超时
    实现要点:
    1.原子状态。原子状态使用CAS操作来存储当前锁的状态,判断锁是否已经被别的线程持有。
    2.等待队列。所有没有请求到锁的线程,会进入等待队列进行等待。待有线程释放锁后,系统从等待队列唤醒一个线程,继续工作。
    3.阻塞原语park()和unpark(),用来挂起和恢复线程。没有得到锁的线程将会被挂起。有关park()和unpark()的详细介绍,参考LockSupport。

    • Condition

      调用时必须拿到持有重入锁
      lock.lock();
      condition.await();//condition.signal()
      lock.unlock();
      调用await()后,会自动释放锁,sleep不会释放锁。await的线程被signal唤醒,会先重新获取对象锁再执行。

    Semaphore

    适合过载控制

    ReentrantReadWriteLock

    CountDownLatch

    CountDownLatch end = new CountDownLatch(10);
    end.countDown;
    end.await();
    

    CyclicBarrier

    CyclicBarrier cb = new CyclicBarrier(10, new Runable());
    
    
    
    cb.await();
    
    cb.await();
    
    cb.await();...
    
    
    
    runable->run
    

    LockSupport

    t1:LockSupport.park()

    main t:LockSupport.unpark(t1)

    ThreadPoolExecutor

    ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
    

    调度逻辑

    调度逻辑

    拒绝策略

    AbortPolicy:直接抛出异常。

    CallerRunsPolicy:直接由当前线程执行任务。

    DiscardOldestPolicy:丢弃最老的任务,尝试重新提交当前任务。

    DiscardPolicy:直接丢弃当前任务。

    可实现RejectedExecutionHandler实现自定义Policy。

    线程数量设置经验

    线程数量设置经验

    Fork/Join

    执行逻辑

    执行逻辑
    - 互相帮助
    
    互相帮助

    ForkJoinPool

    ThreadLocal

    每个线程都有自己的ThreadLocalMap,其中key为ThreadLocal对象,示例中value为SimpleDateFormat实例。

    ThreadLocal对象的get方法,会先获取调用线程的ThreadLocalMap,然后以ThreadLocal对象为key取出对应的value。

    ThreadLocalMap类似WeakHashMap,key是WeakReference<ThreadLocal>,当ThreadLocal的外部强引用被回收时,ThreadLocal对象将被回收,key将会为null。当系统清理ThreadLocalMap时,(比如将新的变量加入Map时会自动进行一次清理),将会回收对应的value对象。


    ThreadLocal

    Disruptor

    环形队列

    伪共享

    相关文章

      网友评论

          本文标题:Java并发

          本文链接:https://www.haomeiwen.com/subject/qgmwnhtx.html