![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发
文章平均质量分 90
babylove_BaLe
不负勇往。
展开
-
Lock接口的介绍及使用
一、Lock的介绍我们知道,在Java中锁的实现可以由synchronized关键字来完成,但在Java5之后,出现了一种新的方式来实现——Lock接口。那么为什么提出这种新的方式呢? 在多线程的情况下,当一段代码被synchronized修饰之后,同一时刻只能被一个线程访问,其他线程都必须等到该线程释放锁之后才能有机会获取锁访问这段代码,占用锁的线程只有在两种情况下才能释放锁: 线程执行完了原创 2017-10-17 22:40:23 · 1735 阅读 · 0 评论 -
多线程经典实例(一)
在多线程的学习当中,有许多经典的例子值得学习,比如售票窗口、线程交替执行、生产者消费者等。下面就来看两个有关线程交替执行的案例。两个线程轮流打印数字这里采用 wait/notify 等待通知和 Lock/Condition 两种方式实现。wait()/notify()实现简单介绍一下wait/notify机制的几个方法。 以下4个方法都必须在获取了锁的情况下才能调用: ...原创 2018-07-20 21:10:44 · 5433 阅读 · 1 评论 -
深入浅出 ThreadLocal 的实现原理
ThreadLocal的简介ThreadLocal称为线程局部变量。在每个线程中都有自己独立的ThreadLocal变量。 每个线程中可有多个threadLocal变量。ThreadLocal的用法public class ThreadLocalDemo { private static ThreadLocal<Integer> threadLocal1...原创 2018-07-14 17:38:30 · 316 阅读 · 0 评论 -
Java并发之Executor框架
一、Executor框架的介绍Java中的线程既是工作单元又是执行机制。JDK1.5开始,把工作单元与执行机制分离开来。工作单元为Runnable(Thread实现该接口)和Callable,执行机制就是Executor框架。 使用Executor框架时不用显式的创建线程Thread。Executor框架由三部分组成: 任务:Runnable或Callable 任务的执行:ExecutorS原创 2017-11-05 11:40:16 · 371 阅读 · 0 评论 -
Java线程池的实现分析
一、线程池的介绍线程池是一种并发框架。优势: 1. 降低资源消耗。(重复利用线程,减少开销) 2. 提高响应速度。(任务到达可直接执行,不需要等待创建线程) 3. 提高线程的可管理性。(统一分配、监控、调优)ThreadPoolExecutor是线程池的核心实现类。可以通过ThreadPoolExecutor来创建一个线程池。二、线程池的实现分析线程池的实现是ThreadPoolExecuto原创 2017-11-03 21:22:12 · 300 阅读 · 0 评论 -
Java并发工具类之Semaphore
一、Semaphore的概念Semaphore又叫信号量,用来控制同时访问特定资源的线程数量。它通过协调各个线程,以保证合理地使用公共资源。Semaphore和CountDownLatch一样,也是维护了一个计数器,其本质是一个共享锁。Semaphore有公平性和非公平性之分。Semaphore的工作过程: 当一个线程想要访问某个共享资源时,它必须要先获取Semaphore;当Semaphor原创 2017-10-26 22:23:02 · 462 阅读 · 0 评论 -
Java并发工具类之CountDownLatch
一、概念CountDownLatch也叫闭锁,是并发包的工具类之一,允许一个或多个线程等待其他线程完成操作后再执行。回忆之前,我们知道Join方法,用于让当前线程等待join的线程执行结束。while(isAlive()){ wait(0);}其原理就是不停地检查join线程是否存活,如果存活则一直等待。 CountDownLatch也可以实现join的功能,且功能更多。 CountD原创 2017-10-26 13:08:56 · 312 阅读 · 0 评论 -
Java并发工具类之CyclicBarrier
一、CyclicBarrier的概念CyclicBarrier的意思是可循环使用的屏障。它可以让一组线程到达一个屏障时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有阻塞的线程才会继续执行。它就好像一道关卡,只有所有的部队(线程)都到了才能放行。二、CyclicBarrier的实现分析部分源码:public class CyclicBarrier { private final Reen原创 2017-10-26 13:03:54 · 349 阅读 · 0 评论 -
Condition的实现分析
一、Condition的概念介绍回忆synchronized关键字,它配合Object的wait()、notify()系列方法可以实现等待/通知模式。对于Lock,通过Condition也可以实现等待/通知模式。Condition是一个接口。 Condition接口的实现类是Lock(AQS)中的ConditionObject。 Lock接口中有个 newCondition()方法,通过这个方法原创 2017-10-25 15:18:32 · 394 阅读 · 0 评论 -
ReentrantReadWriteLock可重入读写锁
一、ReentrantReadWriteLock的概念介绍前面提到的锁(独占锁、ReentrantLock)等都是排他锁,这些锁在同一时刻只允许一个线程访问。 而读写锁在同一时刻可以允许多个读线程访问,但在写线程访问时,所有读线程和其他写线程都阻塞。ReadWriteLock并不是继承自Lock接口,而是一个单独的接口。public interface ReadWriteLock { Lo原创 2017-10-24 15:26:57 · 343 阅读 · 0 评论 -
深入理解synchronized关键字
一、synchronized的基本介绍谈到synchronized关键字,想必大家都不陌生,对它的初次印象如果用两个字来概括,无非就是 “同步” 。小小的一个词,蕴含了大道理,那么就让我们来探索一下。 1.简介synchronized实现同步的基础是:java中的任何一个对象都可以作为锁。 它有三种用法: 1. 修饰普通同步方法,锁是当前实例对象 2. 修饰静态同步方法,锁是当前类的clas原创 2017-10-14 17:26:40 · 384 阅读 · 0 评论 -
ReentrantLock重入锁
一、ReentrantLock概念重入锁概念什么是重入锁? 顾名思义,就是支持重复进入的锁。 定义:支持一个线程对资源的重复加锁。(注意是一个线程)回忆前面有关AQS实现的文章,关于独占锁,当一个线程获取锁后,如果该线程再次调用lock()方法,那么该线程会被自己阻塞。 原因是在实现tryAcquire()时没有考虑占有锁的线程再次获取锁的场景。因此这个锁是不支持重入的锁。 回顾synch原创 2017-10-23 11:40:56 · 578 阅读 · 0 评论 -
深入理解volatile关键字
一、volatile的特性1. volatile的可见性可见性的意思是:当一个线程修改一个共享变量时,另一个线程能读到这个修改的值。 volatile在多线程的开发中,保证了共享变量的可见性(立即)。//全局变量boolean open=true;//线程Aresource.close();open = false;//线程Bwhile(open) {doSomething(resou原创 2017-10-11 22:29:39 · 369 阅读 · 0 评论 -
AQS共享锁的实现原理
一、AQS共享锁的实现原理前面的文章Lock的实现中分析了AQS独占锁的实现原理,那么接下来就分析下AQS是如何实现共享锁的。共享锁的介绍共享锁:同一时刻有多个线程能够获取到同步状态。那么它是如何做到让多个线程获取到同步状态呢? 来看一下获取共享锁的过程: 1. 线程调用AQS的acquireShared()申请获取锁(可有多个线程获取到,根据重写的tryAcquireShared()方法决定原创 2017-10-20 00:44:45 · 3029 阅读 · 0 评论 -
Lock实现之AbstractQueuedSynchronizer——AQS
一、AQS的介绍队列同步器AbstractQueuedSynchronizer(AQS)是构建锁或者其他同步组件的基础框架,是实现Lock的基础。它使用了一个volatile修饰的int变量来表示同步状态,并维护了一个FIFO队列来完成资源获取线程的排队。public abstract class AbstractQueuedSynchronizer extends AbstractOwnableS原创 2017-10-18 19:23:46 · 513 阅读 · 1 评论 -
多线程经典实例(二)
上一篇文章多线程经典实例(一) 讲到了几个多线程相关的例子,接下来我们来看一个经典的案例:生产者消费者问题。介绍生产者消费者问题是多线程中的一个经典问题,问题大概就是有一块缓冲区作为仓库,当仓库未满时生产者可以将产品放入仓库,当仓库未空时消费者可以从仓库取走产品。解决这个问题的核心就是处理好多线程之间的同步与协作。生产者消费者的实现方式通常有以下几种方式来实现生产者与消费者...原创 2018-07-21 14:23:27 · 357 阅读 · 0 评论