
线程安全
javashareauthor
分享让知识变得更加得有价值
展开
-
线程池
基础知识:Executor.newFixedThreadPool(3);newFixedThreadPool是linkedBlockQuene就是无界阻塞队列。3就是核心线程,当线程1进来之后,判断此时线程数是否小于核心线程。如果不小于,则创建线程执行任务,否则进入到阻塞队列,等待线程执行。原代码如下: public static ExecutorService newFixedThreadPool(int nThreads) { return new...原创 2021-02-18 23:13:10 · 321 阅读 · 0 评论 -
AQS
基础知识:多线程同时访问一个共享数据,synchronized、cas、concurrentHashMap、lock等。多个线程过来,都尝试对同一个lock对象进行加锁ReentrantLock lock = new ReentrantLock ();Lock.lock();// 业务代码Lock.unlock();AQS的原理图:ReentrantLock 默认是非公平锁,要想变为公平锁,则需要初始化的时候传入参数true。(唤醒的时候如果这个时候线程3强制执行cas且执行原创 2021-02-18 23:11:57 · 179 阅读 · 0 评论 -
concurrentHashMap
基础知识:在普通的hashmap多线程访问的时候是会存在线程安全的,如果这个时候对整个map进行加锁,效率低下。如:线程1要put位置是数组5,线程2要put是数组21,实际上这个时候是不需要加锁。那么jdk中提供了concurrentHashMap默认实现了线程安全性。在jdk1.7及之前,是分段加锁数组1,数组2,数组3, 每一个数组对应一个锁// 多个线程来的时候,线程1要put的位置是数组1,线程2要put的位置是数组2Jdk1.8之后,做了一些优化和改进,锁粒度的细化一个大的数原创 2021-02-18 23:10:19 · 132 阅读 · 1 评论 -
Synchronized
基础知识:加锁一般来说都是必须对一个对象进行加锁的。实现的底层原理是什么?两个指令:monitorenter \ monitorexit答:每个对象都有一个monitor,如果要加锁,就必须先对对象关联的monitor进行获取,然后进行加锁。Monitor是有一个计数器,最开始等于0,现在如果有一个线程进入了,那么这个时候就设置为1,如果该线程再次进行加锁,则设置为计数器为2,以此类推。如果执行完代码片段之后,则执行指令monitorexit,将计数器设置为0,这个其他的线程就可以继续进入进原创 2021-02-18 23:04:24 · 104 阅读 · 0 评论 -
Spring 中的单例 bean 的线程安全问题了解吗?
大部分时候我们并没有在系统中使用多线程,所以很少有人会关注这个问题。单例 bean 存在线程问题,主要是因为当多个线程操作同一个对象的时候,对这个对象的非静态成员变量的写操作会存在线程安全问题。常见的有两种解决办法: 在Bean对象中尽量避免定义可变的成员变量(不太现实)。 在类中定义一个ThreadLocal成员变量,将需要的可变成员变量保存在 ThreadLocal 中...原创 2019-11-29 18:10:28 · 1262 阅读 · 0 评论