随笔分类 - 并发
摘要:AQS实现原理 ReentrantLock和Synchronization一样是可重入锁,Synchronization是sun公司开发,而ReentrantLock是一个叫Doug Lea的人写出来的。它控制锁的状态是通过AQS(抽象队列同步器)来实现的,说白了就是 等待队列 + CAS。 (1)
阅读全文
摘要:初始化 创建的时候,实际就是指定了队列大小 capacity,然后队列node其实就是个单向列表结构,item 是当前元素,next 是下一个元素的引用。默认head指针和last指针都是指向这个空节点。ps: 是不是有点责任链模式的感觉呢。 put put 从队列尾部插入节点 1. 首先也是获取到
阅读全文
摘要:ConcurrentLinkedQueue 是一个基于链表的无界线程安全队列,非阻塞实现方式,先进先出,适合高并发的场景。可以看出其底层就是一个单向链表结构。 offer offer从队尾插入元素 1. newNode 首先是将当前线程封装成一个node节点2. 进入for死循环,t为tail节点,
阅读全文
摘要:Semaphore,等待指定数量的线程完成任务即可 public class A { private static SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 同步关键类,构造方法传入的数字是多少,则同一
阅读全文
摘要:案例 public static void main(String[] args) throws Exception{ Map<String,Object> map = new A().test(); for(Map.Entry<String, Object> e : map.entrySet())
阅读全文
摘要:CountDownLatch 计数器设置默认的 count ,然后调用 await() 的线程会一直被挂起,直到 count 个线程都执行 countDown() 之后,被挂起的线程才会唤醒,接着走下面的逻辑。 public static void main(String[] args) throw
阅读全文
摘要:Object 中可以通过 wait() 、notify() 来休眠唤醒。Condition 中同样可以实现这样的效果。 static ReentrantLock lock = new ReentrantLock(); static Condition condition = lock.newCond
阅读全文
摘要:多线程访问同一个共享变量的时候容易出现并发问题,很多时候我们是通过加锁解决的。但是,当我们在创建一个变量后,如果每个线程对其进行访问的时候访问的都是线程自己的变量这样就不会存在线程不安全问题。那么这就要提到 ThreadLocal 了。比如很多公司做单点登录会用到 ThreadLocal ,通过拦截
阅读全文
摘要:ReentrantLock 中还有 ReentrantReadWriteLock 这么一个变种,读读不互斥,读写互斥,写写互斥。 写锁 一开始,就是 tryAcquire 获取锁,如果获取失败就返回 false ,那就走 addWaiter 将请求入队,然后 acquireQueued 挂起线程。和
阅读全文
摘要:JDK1.7 中的 ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组结构组成,即 ConcurrentHashMap 把哈希桶数组切分成小数组(Segment ),每个小数组有 n 个 HashEntry 组成。操作时是通过ReentrantLock对S
阅读全文
摘要:CAS机制 除了synchronized之外,java还提供了一些并发包。比如现在这段代码,肯定会有并发问题,我们当然可以通过重磅的 synchronized 锁来解决多线程并发问题,但是这样就有点杀鸡用牛刀了。我们可以用Atomic原子类来解决这个问题。 import java.util.conc
阅读全文
摘要:加锁原理 synchronized (a){} 锁住的就是()里面的对象,多个线程对同一个对象操作时,就会形成互斥效果,如果是操作两个不同的对象,那么就不会受synchronized影响。 public class SynchronizedDemo { public static void main
阅读全文
摘要:比如现在我们有这样一段代码:线程等待另一个线程将数据装载完就输出success,可是最后程序一直卡在while循环里没有往下执行。 public class VolatileDemo { private static boolean flag = false; //private static vo
阅读全文
摘要:线程生命周期(线程状态) Java中的线程的生命周期大体可分为5种状态。 新建:创建完线程、还没调用start方法。 就绪:已经调用start方法,等待CPU分配时间片。 运行:run方法正在运行中。 阻塞:wait、sleep、yield、join 使线程阻塞住。 死亡:run方法运行完毕。 多线
阅读全文