![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
并发、线程
并发、线程
一只叫狗的猫
空中楼阁
展开
-
读写锁-ReentrantReadWriteLock
在看这篇之前先看看AQS框架的实现原理,很多重复的代码我就不在这里进行介绍了。https://blog.csdn.net/zgsxhdzxl/article/details/95032337 重入锁 ReentrantLock 是排他锁,排他锁在同一时刻仅有一个线程可以进行访问,但是在大多数场景下,大部分时间都是提供读服务,而写服务占有的时间较少。然而,读服务不存在数据竞争问题,如果一个线程在读时禁止其他线程读势必会导致性能降低。所以就提供了读写锁。 读写锁维护着一对...原创 2020-05-12 23:28:17 · 273 阅读 · 0 评论 -
ThreadLocal
https://blog.csdn.net/Y0Q2T57s/article/details/83247430https://www.jianshu.com/p/dde92ec37bd1作用、概念threadLocal是为了解决对象不能被多线程共享访问的问题,通过threadLocal.set方法将对象实例保存在每个线程自己所拥有的threadLocalMap中,这样每个线程使用自己的...原创 2020-03-07 10:50:30 · 133 阅读 · 0 评论 -
并发线程常见面试题
高并发下如何安全的修改数据这个问题其实就是两个关键,一个是高并发一个是安全,回答这个问题从两方面回答。JVM锁Synchronized lock分布式锁zookeeper分布式锁 基于临时节点。当获取锁的时候,就去zookeeper创建临时节点,如果创建成功那么获取锁成功,如果失败,那么就监听该节点,当节点删除的时候,就重新去获取锁。 基于临时顺序节点。每个线程来获取锁...原创 2020-02-16 23:13:22 · 185 阅读 · 0 评论 -
并发容器
常用方法 方法 抛出异常 返回值 阻塞 超时退出 插入 add offer put offer 移除 remove poll take poll 检查 element peek null null 抛出异常:队列满时,往队列插入元素,会抛异常;当队列空时,从队列里获取元素也...原创 2019-08-01 17:34:17 · 94 阅读 · 0 评论 -
线程池ThreadPoolExecutor
概念线程池是创建一定数量的线程,等待任务的到来,在执行完任务之后,继续放在池子中继续等待。优点降低资源的消耗,节省线程创建和销毁的消耗。 提高响应速度,节省创建和销毁的时间 方便进行线程管理简易线程池实现这里实现了个非常简单的线程池,功能非常简单,仅仅为了方便理解线程池。public class MyThreadPoolDemo { private stati...原创 2019-08-03 11:33:27 · 178 阅读 · 0 评论 -
ReentrantLock解析
ReentrantLock是基于AQS实现的,所以在之前必须先看看AQS解析这篇文章https://blog.csdn.net/zgsxhdzxl/article/details/95032337,或者这篇https://www.cnblogs.com/java-zhao/p/5131544.html也是写的很详细很好的。ReentrantLock是独占锁,实现了Lock接口,支持公平锁和...原创 2019-07-27 14:43:51 · 92 阅读 · 0 评论 -
显示锁Lock概念
Lock和synchronized比较 Lock必须手动释放锁 lock可以尝试获取锁 lock可以中断获取锁的线程 lock可以设置超时获取锁 Lock是接口,synchronized是java中的关键字 synchronized简单、可读性好synchronized:是java中的关键字。修饰代码块:被修饰的代码为同步代码块,作用对象是调用这个代码块的对象。...原创 2019-07-27 14:31:22 · 230 阅读 · 0 评论 -
原子操作CAS-预备知识
什么是原子操作 不可被中断的一个或一系列操作。 CAS原理 比较与交换。CAS操作包含三个参数:内存位置、预期原值和新值。如果内存位置的值与预期原值相匹配,那么就会给该内存位置赋上新值,否则,不做任何操作。 CAS缺陷 ABA问题 ABA问题指的是:例如有一个线程A,从内存位置V中取出1,之后线程B,将该内存位置的值变为2,线程C又将该内存位置的值变为...原创 2019-07-27 14:39:42 · 126 阅读 · 0 评论 -
Atomic相关类
基本类型 AtomicInteger static AtomicInteger atomicInteger = new AtomicInteger(1); public static void main(String[] args) { // 输出原值并且+1 ------1 System.out.println(atomicInteg...原创 2019-07-27 14:39:11 · 159 阅读 · 0 评论 -
AQS(AbstractQueuedSynchronizer)解析
定义 AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch。 数据结构 它维护了一个state,代表共享资源,一个等待队列,多线程调用资源被阻塞时候就会进入此队列 AQS使用了模板方法模式,自定义的同步器在在实现时只需要实现共享资源state的获...原创 2019-07-27 14:31:30 · 158 阅读 · 0 评论 -
Condition解析
先看完AQShttps://blog.csdn.net/zgsxhdzxl/article/details/95032337,再来看比较容易理解。condition可以对线程进行阻塞和唤醒。类似wait/notify,不同的是condition可以方便地对持有锁的线程进行阻塞和唤醒。我们知道AQS中有一个队列是同步队列,condition也有一个队列叫等待队列,不过同步队列是双向的,等待队...原创 2019-07-27 14:43:08 · 140 阅读 · 0 评论 -
并发工具类
Fork/Join框架 将一个大任务,进行拆分(fork)成n个小任务(直到不可再分),再将小任务运算结果进行join汇总。 工作密取:例如任务分成了两个线程执行,当A线程执行完后B线程还未执行完,则A线程会去B线程偷取任务执行,执行完之后再放入B,被窃取任务线程永远从头部拿任务执行,而窃取任务的线程从尾部拿任务执行。 RecursiveAction,用于没有返回结...原创 2019-04-03 20:32:41 · 227 阅读 · 0 评论 -
线程基础知识
线程启动方式Thread类Runable接口Callable接口(有返回值) private static class Test implements Callable<String> { @Override public String call() throws Exception { return "Cal...原创 2019-03-25 23:57:57 · 146 阅读 · 0 评论 -
线程、锁-预备知识
线程和进程进程。程序运行资源分配的最小单位,一个进程内部可能有多个线程,多个线程共享进程资源。 线程。cpu调度的最小单位,线程必须依附于进程,调用进程所分配的资源。并行和并发并发。单位事件内可以同时处理事件的能力。 并行。同一时刻处理事件的能力。并发编程优点充分利用cpu资源 加快处理请求的时间注意事项线程共享资源造成的线程安全问题 有可能造成死锁 分配过多的...原创 2019-03-25 09:55:54 · 180 阅读 · 0 评论