![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发
_s牧之
这个作者很懒,什么都没留下…
展开
-
2.3 并发类容器CurrentHashMap
1.古老的同步类容器像:Vector(List),HashTable(Map),都是对整个数据结构加了锁,性能最低2.通过封装,将非锁的容器定义为加锁的容器对于非线程安全的list,对同一个位置处并发写入,则可能会覆盖,所以次数是小于1万package com.caolh.middle;import java.util.ArrayList;import java.util.C...原创 2018-08-26 00:27:06 · 179 阅读 · 0 评论 -
1.5 线程的 5种状态
线程的5个状态说明:线程共包括以下5种状态。1. 新建状态(New) : 线程对象被创建后,就进入了新建状态。例如,Thread thread = new Thread()。2. 就绪状态(Runnable): 也被称为“可执行状态”。线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程。例如,thread.start()。处于就绪状态的线程,随时...原创 2018-08-21 23:44:25 · 154 阅读 · 0 评论 -
2.1 Actomic类和乐观锁
该类实现了原子性操作。CAS -->compare and set ,乐观锁 实现,并未有真正的锁这种乐观锁和synchronized 不同,并没有将线程阻塞,而是通过各个线程不停地循环,判断版本号是否与之前相同,从而进行更新操作。t1和t2两个线程同时去进行++操作,t1获取了最新版本号1,进行update操作时候v1 ==v0 (假设此时t2还未接入),v0=2,a=4执...原创 2018-08-24 21:33:33 · 1379 阅读 · 0 评论 -
1.4 wait/notify 实现线程安全的阻塞队列
要解决2个问题:1.多个线程并发从队列取数据,写数据,要保证同步2.单个线程取数据,数据为空,阻塞;单个线程写数据,数据满了,阻塞package com.caolh.base;import java.util.ArrayList;import java.util.List;class MQueue { private List<String> list...原创 2018-08-21 01:33:20 · 282 阅读 · 0 评论 -
1.3 wait 和notify 原理
wait 和notify 是实现线程之间的协同工作,必须结合synchronized使用,wait 释放锁,notify 不释放锁(但是此时会通知在等待的wait,该notify完全执行完毕,才真正释放锁)public class DemoThread18{ //原子类 private volatile List<String> list = new ArrayList...原创 2018-08-21 01:31:08 · 389 阅读 · 0 评论 -
1.2 死锁 原理
两个线程,假设第一个线程先执行了execute1拿到lock1 锁标记,sleep,让出cpu时间片;第二个线程 拿到lock2。此时线程1尝试拿lock2 始终拿不到,线程2也是如此,所以进入死锁状态。public class DemoThread12 { private Object lock1 = new Object(); private Object lock2 = ne...原创 2018-08-21 01:25:03 · 130 阅读 · 0 评论 -
1.1 认识synchronized 关键字
两个线程有单独的工作内存和共同访问的主内存不同线程安全的概念: 1.如果多线程访问一个类、对象、方法表现的特征和一个线程访问的结果一致,那么这个类、对象、方法就是线程安全的 2.线程安全问题是由对象的成员变量和类的静态变量引起的 3.每个线程对成员变量和静态变量只有读操作,是线程安全的,有写操作,那么就是线程不安全的package com.caolh.bas...原创 2018-08-21 01:20:15 · 136 阅读 · 0 评论 -
1.6关于volatile 关键字的探讨
其实我是发现有矛盾的问题的。多线程主要是 可见性、原子性的问题,volatile 主要是 解决了可见性的问题,原子性并未解决,所以仍是线程不安全的。如果没有volatile 关键字,两个线程,左边线程从共享内存中获取x=1 ,将x给到自己的工作内存,修改后,写回共享内存,此时线程2是不知道的,获取的仍是x=1;加了volatile ,则线程1 ,直接对共享内存的x操作,线程2是立刻...原创 2018-08-23 00:04:53 · 147 阅读 · 0 评论 -
2.4并发类容器CopyOnWriteArrayList和CopyOnWriteArraySet
采用的读写分离,读的是旧的array,写的是新的arraypackage com.caolh.middle;import java.util.HashSet;import java.util.Iterator;import java.util.LinkedHashSet;import java.util.Set;import java.util.TreeSet;impor...原创 2018-08-26 12:46:09 · 139 阅读 · 0 评论 -
2.2 ThreadLocal 的使用
ThreadLoacal 成员变量是在JVM 里 对每个线程 单独进行了copy,所以,各个线程之间是不会影响的。t1 和t2 两个线程 操作th线程局部变量,t1 和t2 各自获得了cp1_th 和cp2_th 对th 的copy ,所以是各自操作各自的,不存在线程不安全的问题。package com.caolh.base;public class DemoThread...原创 2018-08-26 00:12:52 · 146 阅读 · 0 评论