Java多线程
鸡毛陈
学海无涯,知行合一。
展开
-
Java多线程学习之:CountDownLatch
概念countDownLatch这个类使一个线程等待其他线程各自执行完毕后再执行。是通过一个计数器来实现的,计数器的初始值是线程的数量。每当一个线程执行完毕后,计数器的值就-1,当计数器的值为0时,表示所有线程都执行完毕,然后在闭锁上等待的线程就可以恢复工作了。例子: public class TestCountDownLatch { public static void main(String[] args) { final CountDownLatch latch = new CountD原创 2021-01-17 13:13:48 · 147 阅读 · 0 评论 -
Java多线程学习之:await/signalAll实现生产者消费者
PCCommon 生产者消费者公共类:public class PCCommon { private Queue<User> queue = new LinkedList<User>(); private Lock lock = new ReentrantLock(); private Condition condition = lock.newCondition(...原创 2019-08-27 21:59:27 · 900 阅读 · 2 评论 -
Java多线程学习之:BlockingQueue实现生产者消费者
PCCommon:public class PCCommon { private BlockingQueue<User> queue = new LinkedBlockingQueue<User>(); //生产 public void productData(User user){ queue.add(user); } //消费 public void ...原创 2019-08-27 22:01:14 · 299 阅读 · 0 评论 -
Java多线程学习之:wait/notifyAll实现生产者消费者
PCCommon 生成消费公共类:public class PCCommon { private Queue<User> queue = new LinkedList<User>(); //生产 public synchronized void productData(){ try{ while(queue.size() == 1 ){ wait...原创 2019-08-27 21:54:05 · 171 阅读 · 0 评论 -
Java多线程学习之:Future和FutureTask
FutureTask是Future的唯一实现类FutureTask是一个可以返回线程执行结果的任务单元,通常在需要线程执行结果的场景中使用FutureTask同时实现了Future接口及Runnable接口,可以很方便的在线程中被执行 Future<T> future = executor.submit(myCallable); T t = future.get(...原创 2019-07-19 08:01:04 · 195 阅读 · 0 评论 -
Java多线程学习之:ThreadLocal
ThreadLocal:不同的线程拥有完全不同的ThreadLocalMap变量当前线程的ThreadLocalMap使用当前的ThreadLocal的实例作为key来存储value值ThreadLocalMap可以使用不同的ThreadLocal作为key线程死亡时,线程局部变量会自动回收内存弱引用问题:static class Entry extends WeakRefere...原创 2019-07-18 20:19:58 · 106 阅读 · 0 评论 -
Java多线程学习之:AQS
AQS工作原理分析一、大致介绍前面章节讲解了一下CAS,简单讲就是cmpxchg+lock的原子操作;而在谈到并发操作里面,我们不得不谈到AQS,JDK的源码里面好多并发的类都是通过Sync的内部类继承AQS而实现出五花八门的功能;本章节就和大家分享分析一下AQS的工作原理;二、简单认识AQS2.1 何为AQSAQS是一个抽象类,类名为AbstractQueuedSynchr...转载 2019-07-16 07:22:42 · 150 阅读 · 0 评论 -
Java多线程学习之:CAS
一、什么是CASCAS操作(又称为无锁操作)是一种乐观锁策略,它假设所有线程访问共享资源的时候不会出现冲突,既然不会出现冲突自然而然就不会阻塞其他线程的操作。因此,线程就不会出现阻塞停顿的状态。那么,如果出现冲突了怎么办?无锁操作是使用**CAS(compare and swap)**又叫做比较交换来鉴别线程是否出现冲突,出现冲突就重试当前操作直到没有冲突为止。二、 CAS的操作过程CAS比...转载 2019-07-16 07:01:12 · 114 阅读 · 0 评论 -
Java多线程学习之:创建线程
实现多线程的方法有3种:1、继承Thread类Thread实现了Runnable接口public class MyThread extends Thread{ @Override public void run(){ System.out.println("MyThread:"+"MyThread"); }}调用:MyThread mt = new MyThread();...原创 2019-07-07 08:25:51 · 187 阅读 · 0 评论 -
Java多线程学习之:锁
一、什么是CAS使用锁时,线程获取锁是一种悲观锁策略,即假设每一次执行临界区代码都会产生冲突,所以当前线程获取到锁的时候同时也会阻塞其他线程获取该锁。而CAS操作(又称为无锁操作)是一种乐观锁策略,它假设所有线程访问共享资源的时候不会出现冲突,既然不会出现冲突自然而然就不会阻塞其他线程的操作。因此,线程就不会出现阻塞停顿的状态。那么,如果出现冲突了怎么办?无锁操作是使用**CAS(compare...转载 2019-07-11 21:48:06 · 151 阅读 · 0 评论 -
Java多线程学习之:ReentrantLock
1. ReentrantLock的介绍ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻塞。在java关键字synchronized隐式支持重入性,synchronized通过获取自增,释放自减的方式实现重入。与此同时,ReentrantLock还支持公平锁和非公平锁两...转载 2019-07-13 20:06:42 · 84 阅读 · 0 评论 -
Java多线程学习之:线程池
一、Executor,Executors及其ExecutorServiceExecutor: 是一个抽象层面的核心接口。Executors: 是一个工具类,类似于 Collections。提供工厂方法来创建不同类型的线程池,比如 FixedThreadPool 或 CachedThreadPool。ExecutorService: 是对Executor 接口进行了扩展,提供了返回 Futu...原创 2019-07-10 22:18:06 · 113 阅读 · 0 评论 -
Java多线程学习之:volatile
volatile:特点:volatile是线程同步的轻量级实现多线程访问volatile不会发生阻塞volatile可以保证数据的可见性,但不能保证原子性,因为它会将私有内存和公共内存中的数据同步volatile解决的是变量在多个线程之间的可见性深入学习:未完待续...原创 2019-07-10 07:34:37 · 120 阅读 · 0 评论 -
Java多线程学习之:三个特性
原子性:是指一个操作是不可中断的。即使是多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。比如,对于一个静态全局变量int i,两个线程同时对它赋值,线程A给他赋值为1,线程B给他赋值为-1。那么不管这两个线程以何种方式。何种步调工作,i的值要么是1,要么是-1.线程A和线程B之间是没有干扰的。这就是原子性的一个特点,不可被中断。可见性:是指当一个线程修改了某一个共享变量的值,...原创 2019-07-10 07:29:09 · 82 阅读 · 0 评论 -
Java多线程学习之:synchronize
synchronize:特点:同步方法,锁定这个对象同步代码块同步静态方法,锁定这个类synchronize(this)是锁定当前对象的,一般使用synchronize(非this对象)synchronize不具有继承性synchronize解决的是多个线程之间访问资源的同步性深入学习:未完待续...转载 2019-07-11 21:44:01 · 308 阅读 · 0 评论