并发
horseber
飞是小李飞刀的飞,刀是小李飞刀的刀
展开
-
ThreadLocal源码解析
ThreadLocal保证各自线程数据私有。不同的线程在给ThreadLocal对象设置不同的值时,他们也不能看到彼此的修改。1、ThreadLocal示例public static class MyRunnable implements Runnable { private ThreadLocal<Integer> threadLocal = ...原创 2019-08-29 15:55:22 · 132 阅读 · 0 评论 -
创建线程的方式
1、继承Thread类Thread thread = new Thread(){ @Override public void run() { //业务处理 }};thread.start();2、实现Runnable接口:Thread thread2 = new Thread(new Runnable() { @Override p...原创 2019-09-02 07:17:00 · 83 阅读 · 0 评论 -
线程池
1、为什么需要线程池如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁new Thread().start()创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程是需要时间。所以利用线程池对线程进行管理。让线程可以复用,执行完一个任务,并不被立即销毁,而是可以继续执行其他的任务 。 2、线程池属性java.uitl.concurrent.Threa...原创 2019-09-07 08:05:15 · 119 阅读 · 0 评论 -
构建线程池
通过Executor框架的工具类Executors,可以创建3种类型的ThreadPoolExecutorFixedThreadPool SingleThreadExecutor CachedThreadPoolFixedThreadPool:FixedThreadPool被称为可重用固定线程数的线程池public static ExecutorService newFixed...原创 2019-09-07 08:12:50 · 119 阅读 · 0 评论 -
CountDownLatch闭锁
1、join我们需要解析一个Excel里多个sheet的数据,此时可以考虑使用多 线程,每个线程解析一个sheet里的数据,等到所有的sheet都解析完之后,程序需要提示解析完 成。在这个需求中,要实现主线程等待所有线程完成sheet的解析操作,最简单的做法是使用 join()方法public class JoinCountDownLatchTest { public stati...原创 2019-09-09 21:22:13 · 127 阅读 · 0 评论 -
LockSupport
让线程进入休眠状态的方式:Thread.sleep()、Object.wait()、LockSupport.park()1、Thread.sleeppublic class MyThread { public static void main(String[] args) { Thread t1 = new Thread(new Runnable() { ...原创 2019-09-10 10:01:11 · 136 阅读 · 0 评论 -
CyclicBarrier
CyclicBarrier的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行。public class CyclicBarrierTest { static CyclicBarrier c = new CyclicBarrier(...原创 2019-09-11 09:06:22 · 105 阅读 · 0 评论 -
Semaphore信号量
Semaphore 使用示例:启动30线程并发地读取几万个文件,读到内存后并存储到数据库,而数据库的连接数只有10个,这时我们必须控制只有10个线程同时获取数据库连接保存数据,就可以使用Semaphore来做并发数量控制。public class SemaphoreTest { private static final int THREAD_COUNT = 30; ...原创 2019-09-11 09:30:43 · 125 阅读 · 0 评论 -
Condition
1、Condition介绍:在Java程序中,任意一个Java对象,都拥有一组监视器方法(定义在java.lang.Object类上),主要包括wait()、wait(long)、notify()、notifyAll()方法,这些方法与synchronized关键字配合。实现等待/通知模式。Condition接口也提供了类似Object的监视器方法,与Lock配合可以实现等待/通知模式。C...原创 2019-09-09 21:05:56 · 182 阅读 · 0 评论 -
公平锁和非公平锁
Lock lock = new ReentrantLock();lock.lock();try{ //业务处理}finally{ lock.unlock();}加锁方法lock()调用轨迹如下:1)ReentrantLock:lock()。 2)NonfairSync:lock()。 3)AbstractQueuedSynchronizer:acquire(i...原创 2019-09-02 07:04:03 · 105 阅读 · 0 评论 -
volatile是如何保证内存可见性的
volatile 修饰的变量具备两种特性:保证共享变量对所有线程的可见性CPU修改数据,首先是对缓存的修改,然后再同步回主存,在同步回主存的时候,如果其他CPU也缓存了这个数据,就会导致其他CPU缓存上的数据失效(通过嗅探总线数据传播,检查缓存对应的主存地址是否被修改过),这样,当其他CPU再去它的缓存读取这个数据的时候发现缓存已失效,就必须从主存重新获取禁止指令重排序优化(有序性)注...原创 2019-08-30 15:16:55 · 1123 阅读 · 0 评论 -
可重入锁
ReentrantLock 和synchronized 都是 可重入锁1、synchronized可重入锁示例public class synchronizedTest implements Runnable { @Override public void run() { test1(); } public static void ma...原创 2019-08-30 15:54:59 · 177 阅读 · 0 评论 -
Synchronized关键字(一)
1、synchronized重量级锁JDK6之前,为重量级锁。当线程获取锁失败,便直接放弃CPU执行时间,将线程挂起阻塞等待,而挂起线程和恢复线程的操作比较耗费性能。所以称之为重量级锁。Synchronized同步代码块基于monitorenter(进入)和(monitorexit)退出指令来实现的。Synchronized同步方法基于ACC_SYNCHRONIZED 标志来隐式实现的...原创 2019-09-01 11:53:37 · 129 阅读 · 0 评论 -
Synchronized关键字(二)
1、Synchronized方法和和同步代码块的锁的对象实例方法同步:锁:该方法所属的实例public synchronized void add(int value){ this.count += value;}静态方法同步锁:class类对象public static synchronized void add(int value){ this.count +...原创 2019-09-01 15:10:45 · 107 阅读 · 0 评论 -
AQS(一)简介和使用
1、AQS简介AQS(AbstractQueuedSynchronizer)即队列同步器。是用来构建锁或者其他同步组件的基础框架,JUC包下的ReentrantLock、Semaphore、ReentrantReadWriteLock、CountDownLatch、SynchronousQueue和FutureTask等,这些阻塞类有一个共同点就是都是基于AQS构建的。 锁是面向使用者,它定...原创 2019-09-01 15:29:44 · 160 阅读 · 0 评论 -
AQS(二):独占式锁
1、AQS属性:以前文章提到过,看一个类的属性这个类整个的功能。AQS中的属性:public abstract class AbstractQueuedSynchronizer{ private transient volatile Node head; private transient volatile Node tail; private volatile in...原创 2019-09-01 20:49:06 · 135 阅读 · 0 评论 -
AQS(三):共享锁
共享式获取同步状态,与独占式的区别在于同一时刻有多个线程获取同步状态;共享式锁相关方法://共享式获取同步状态,与独占式的区别在于同一时刻有多个线程获取同步状态;void acquireShared(int arg);//在acquireShared方法基础上增加了能响应中断的功能;void acquireSharedInterruptibly(int arg);//在ac...原创 2019-09-01 21:08:27 · 98 阅读 · 0 评论 -
Exchanger线程间数据交换
Exchanger可以在两个线程之间交换数据,只能是2个线程,他不支持更多的线程之间互换数据。Exchanger用于进行线程间的数据交换。它提供一个同步点,两个线程通过exchange方法可以交换彼此的数据。如果第一个线程先执行exchange()方法,它会一直等待第二个线程也执行exchange方法,当两个线程都到达同步点时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对方。...原创 2019-09-11 09:34:01 · 191 阅读 · 0 评论