通过源码可以看出 使用 CAS + synchronized 方式时 加锁的对象是每个链条的头结点,也就是 锁定 的是冲突的链表,所以再次提高了并发度,并发度等于链表的条数或者说 桶的数量。那为什么sement 不把段的大小设置为一个桶的,因为在高并发的情况下如果 ReentrantLock 发生冲 ...
分类:
其他好文 时间:
2020-02-20 13:27:46
阅读次数:
108
一、源码 1、Lock接口 void lock(); 锁 void lockInterruptibly() throws InterruptedException; 在等待锁时被中断会抛异常 boolean tryLock(); 判断锁是否可用,可用就获取 boolean tryLock(long ...
分类:
其他好文 时间:
2020-02-18 10:09:04
阅读次数:
56
1.简介 并发中常用的ReentrantLock,是一种典型的排他锁,这类锁在同一时刻只允许一个线程进行访问,实际上将并行操作变成了串行操作。在并发量大的业务中,其整体效率、吞吐量不能满足实现的需要。而且实际的业务中一般情况是读多于写,多个线程读操作不会改变已经有的数据,不会有数据的一致性问题,而一 ...
分类:
其他好文 时间:
2020-02-15 10:15:42
阅读次数:
84
Reentrantlock Reentrantlock在AQS源码解析中已经捎带着解析过了,这里不再提及 CountDownLatch CountDownLatch在AQS源码解析中也已经解析过了,这里同样不再提及 CyclicBarrier CountDownLatch 基于 AQS 的共享模式的 ...
分类:
其他好文 时间:
2020-02-12 22:21:05
阅读次数:
79
线程安全之 synchronized 和 ReentrantLock + 面试题 前面我们介绍了很多关于多线程的内容,在多线程中有一个很重要的课题需要我们攻克,那就是线程安全问题。线程安全问题指的是在多线程中,各线程之间因为同时操作所产生的数据污染或其他非预期的程序运行结果。 线程安全 1)非线程安 ...
分类:
编程语言 时间:
2020-02-07 14:31:13
阅读次数:
57
前面我们看了可重入锁ReentrantLock,其实这个锁只适用于写多读少的情况,就是多个线程去修改一个数据的时候,适合用这个锁,但是如果多个线程都去读一个数据,还用这个锁的话会降低效率,因为同一时刻只能是一个线程去读取! 本次我们看看读写锁ReentantReadWriteLock,这个锁采用了读 ...
分类:
其他好文 时间:
2020-02-06 19:55:16
阅读次数:
60
经典笔试题: 1、自定义容器,提供新增元素(add)和获取元素数量(size)方法。2、启动两个线程。线程1向容器中新增10个数据。线程2监听容器元素数量,当容器元素数量为5时,线程2输出信息并终止。 package com.gaopeng.programming.test2; import jav ...
分类:
编程语言 时间:
2020-02-05 18:13:53
阅读次数:
86
1 可重入锁 可重入锁,也叫递归锁。它有两层含义,第一,当一个线程在外层函数得到可重入锁后,能直接递归地调用该函数,第二,同一线程在外层函数获得可重入锁后,内层函数可以直接获取该锁对应其它代码的控制权。之前我们提到的synchronized和ReentrantLock都是可重入锁。 通过ReEnte ...
分类:
编程语言 时间:
2020-02-02 14:04:05
阅读次数:
68
4、显式锁和AQS 显式锁 Lock接口和核心方法 package com.xiangxue.ch4; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * @au ...
分类:
其他好文 时间:
2020-02-01 14:48:15
阅读次数:
89
1 sleep 在哪里都可以用 调用Thread.sleep()但是 wait方法只能在同步方法和同步代码块中使用 wait也就是使得该线程成为阻塞状态(注意这里阻塞不是书本操作系统下的while循环实现的...我TM学傻了,这里阻塞特点1. 不耗cpu的等待;2. 线程安全;) 2.notify( ...
分类:
其他好文 时间:
2020-02-01 14:33:46
阅读次数:
87