Fork me on GitHub

随笔分类 -  并发

摘要:简介: CountDownLatch 是一个非常实用的多线程控制工具类,通常用来控制线程的等待,它可以让某个线程等待直到倒计时结束 CountDownLatch 提供了两个主要的方法,await()、countDown()。 await:使当前线程阻塞,等待计数器为 0 countDown:计数器减 阅读全文
posted @ 2018-06-25 11:36 郑斌blog 阅读(2922) 评论(0) 推荐(0) 编辑
摘要:简介 Future 模式是多线程开发中的一种常见设计模式,它的核心思想是异步调用。 比如我们在网上购物,付款后就会产生一个订单,之后你该干嘛干嘛,快递小哥会上门送货,而不必像在超市结账那样,付款后要等着收银员打出小票再帮你打包商品,这个时间你只能站那等着。 总的来说,Future 模式无法立即给出你 阅读全文
posted @ 2018-01-21 16:24 郑斌blog 阅读(625) 评论(0) 推荐(0) 编辑
摘要:ThreadPoolExecutor 简介 ThreadPoolExecutor 是线程池类。 通俗的讲,它是一个存放一定数量线程的线程集合。线程池允许多个线程同时运行,同时运行的线程数量就是这个线程池的容量,也会有一部分线程出现阻塞,线程池此时也会通过响应的拒绝策略来处理。 构造函数参数说明 co 阅读全文
posted @ 2017-10-29 15:37 郑斌blog 阅读(906) 评论(0) 推荐(2) 编辑
摘要:什么是线程池? 为了避免系统频繁地创建和销毁线程,我们可以让创建的线程进行复用。用线程时从线程池中获取,用完以后不销毁线程,而是归还给线程池。 JDK 对线程池的支持 为了更好的控制多线程,JDK 提供了一套线程池框架,结构如下图所示 它们都在 java.util.concurrent 包中。 Ex 阅读全文
posted @ 2017-10-29 15:02 郑斌blog 阅读(815) 评论(0) 推荐(0) 编辑
摘要:简介 信号量为多线程协作提供了更为强大的控制方法。也可以说,信号量是对锁的扩展。无论是内部锁 synchronized 还是重入锁 ReentrantLock,一次都只允许一个线程访问一个资源,而信号量却可以指定多个线程,同时访问某一个资源。 其构造函数如下: 常用方法: 应用场景 Semaphor 阅读全文
posted @ 2017-03-06 11:18 郑斌blog 阅读(1143) 评论(0) 推荐(0) 编辑
摘要:简述 这两个操作就好比播放器的暂停和恢复。 但这两个 API 是过期的,也就是不建议使用的。 不推荐使用 suspend() 去挂起线程的原因,是因为 suspend() 在导致线程暂停的同时,并不会去释放任何锁资源。其他线程都无法访问被它占用的锁。直到对应的线程执行 resume() 方法后,被挂 阅读全文
posted @ 2017-03-05 16:59 郑斌blog 阅读(14280) 评论(0) 推荐(1) 编辑
摘要:简述 ReentrantLock 是一个可重入的互斥(/独占)锁,又称为“独占锁”。 ReentrantLock通过自定义队列同步器(AQS-AbstractQueuedSychronized,是实现锁的关键)来实现锁的获取与释放。 其可以完全替代 synchronized 关键字。JDK 5.0 阅读全文
posted @ 2017-03-05 09:08 郑斌blog 阅读(7929) 评论(0) 推荐(0) 编辑
摘要:持续更新系列。参考自Java多线程系列目录(共43篇)、《Java并发编程实战》、《实战Java高并发程序设计》。 基础Java多线程——过期的suspend()挂起、resume()继续执行线程;Java多线程——sychronized Java中Volatile关键字详解;Java中SynchronizedMap与ConcurrentHashMap的对比;Java中ThreadLocal的深入理解 阅读全文
posted @ 2017-02-23 22:18 郑斌blog 阅读(3014) 评论(0) 推荐(1) 编辑
摘要:简介 Condition中的await()方法相当于Object的wait()方法,Condition中的signal()方法相当于Object的notify()方法,Condition中的signalAll()相当于Object的notifyAll()方法。 不同的是,Object中的wait() 阅读全文
posted @ 2017-02-20 19:15 郑斌blog 阅读(7617) 评论(0) 推荐(1) 编辑
摘要:概述 关键字synchronized的作用是实现线程间的同步。它的工作是对同步的代码加锁,使得每一次,只能有一个线程进入同步块,从而保证线程间的安全性。 直接作用于实例方法(普通同步方法):对当前实例加锁,进入同步代码前要获得当前实例的锁。 直接作用于静态方法(静态同步方法):对当前类加锁(当前类的 阅读全文
posted @ 2016-07-22 22:24 郑斌blog 阅读(1151) 评论(0) 推荐(1) 编辑
摘要:锁分段概述 在某些情况下,可以将锁分解技术进一步扩展为对一组独立对象上的锁进行分解,这种情况被称为锁分段。例如:ConcurrentHashMap。 锁分段的缺点 与采用单个锁来实现独占访问相比,要获取多个锁来实现独占访问将更加困难并且开销更高。通常,在执行一个操作时最多只需获取一个锁,但在某些情况 阅读全文
posted @ 2016-07-19 17:36 郑斌blog 阅读(1655) 评论(0) 推荐(0) 编辑
摘要:如何使用 概述 ConcurrentHashMap: 线程安全; 其将整个Hash桶进行了分段segment,也就是将这个大的数组分成了几个小的片段segment,而且每个小的片段segment上面都有锁存在,那么在插入元素的时候就要先找到应该插入到哪一个片段segment,然后再在这个片段上面进行 阅读全文
posted @ 2016-07-19 16:53 郑斌blog 阅读(3640) 评论(0) 推荐(2) 编辑
摘要:官方对ThreadLocal的描述: "该类提供了线程局部(thread-local)变量。这些变量不同于它们的普通对应物,因为访问某个变量(通过其get或set方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。ThreadLocal实例通常是类中的private static字段,它们 阅读全文
posted @ 2016-07-15 19:38 郑斌blog 阅读(4667) 评论(0) 推荐(3) 编辑
摘要:Java提供的原子类是靠 sun 基于 CAS 实现的,CAS 是一种乐观锁。关于乐观锁与悲观锁。 原子变量类相当于一种泛化的 volatile 变量,能够支持原子的和有条件的读-改-写操作。AtomicInteger 表示一个int类型的值,并提供了 get 和 set 方法,这些 Volatil 阅读全文
posted @ 2016-07-10 15:01 郑斌blog 阅读(8437) 评论(2) 推荐(1) 编辑
摘要:乐观锁 乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condi 阅读全文
posted @ 2016-07-10 12:13 郑斌blog 阅读(4231) 评论(0) 推荐(0) 编辑
摘要:一、基本概念 先补充一下概念:Java 内存模型中的可见性、原子性和有序性。 可见性: 可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉。通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情。为了确保多个线程之间对内存写入操作的可见性,必须使用同步 阅读全文
posted @ 2016-07-08 22:50 郑斌blog 阅读(332858) 评论(42) 推荐(136) 编辑
摘要:这是美团一面面试官的一个问题,后来发现这是一道面试常见题,怪自己没有准备充分:i++;在多线程环境下是否存在问题?当时回答存在,接着问,那怎么解决?。。。好吧,我说加锁或者synchronized同步方法。接着问,那有没有更好的方法? 经过一番百度、谷歌,还可以用AtomicInteger这个类,这 阅读全文
posted @ 2016-07-08 12:47 郑斌blog 阅读(22607) 评论(1) 推荐(0) 编辑

点击右上角即可分享
微信分享提示