- 博客(33)
- 收藏
- 关注
原创 8.ReentrocLock
这里非公平锁NonFairSync的源码跟之前公平锁的tryAcquire方法源码几乎一致。(1)公平锁:唯一不同的是公平锁在资源state == 0也就是没人加锁的时候,通过hasQueuedPrecessors()方法判断等待队列有没有在等待,如果有人在等待则它立马放弃去加锁。(2)非公平锁:非公平锁在state == 0 也就是没人加锁的时候,才不管你等待队列有没有人在等待,它不在乎,比较自私一点,直接就去争抢锁,成功就返回了。
2023-07-09 17:01:37 202
原创 7.Atomic系列之LongAdder的底层原理(分段锁提升并发性能)
这一章节我们就来讲解CAS带来的另外一个问题,在并发激烈的时候,产生大量的自旋,空耗CPU的问题,以及怎么使用分段锁机制解决这个问题的,我们以LongAdder这个原子类来举例讲解。AtomicInteger的缺陷:并发竞争激烈时导致大量线程自旋LongAdder采用分段锁的思想**,去减少并发竞争的;我打个比方还是上面10000个线程并发操作,但是LongAdder内部可能有10个锁,不同的线程可能去竞争不同的锁,平均下来可能是1000个线程竞争1个锁这样;并发性能这样比起AtomicInteger可能就
2023-05-22 00:12:18 322
原创 4.volatile关键字
(只有当主存中i的值变化了之后或者第一次获取才会从主存中获取,否则是不会的,它有一个总线嗅探机制(MESI有讲),这里不详解)得到。就使用读取主内存的旧值 i = 0 ,然后执行use指令将 i = 0的值传递给线程B去进行操作了。就使用读取主内存的旧值 i = 0 ,然后执行use指令将 i = 0的值传递给线程B去进行操作了。但是这个时候**还没来的将最新的结果刷新回主内存的时候,前面去的,所以必须先执行完前面的执行之后,才能执行。的,这样它看到线程A的执行就是有序的。加上之后,线程A的指令。
2023-05-09 20:34:47 245 1
转载 2.MESI缓存一致性协议
MESI协议也叫做缓存一致性协议,主要是用来进行协调多核CPU的高级缓存的数据一致的。MESI一致性协议定义了高速缓存中数据的4种状态,分别是:M(Modified): 修改过的,只有一个CPU能独占这个修改状态,独占的意思是当有一个CPU的高速缓存数据处于这个状态的时候,其它CPU的高速缓存对这个共享的数据均不能操作;此时高速缓存中的数据发生了更新,需要被刷入主内存中。E(Exclusive): 独占状态,只有一个CPU能独占这个状态,同样当某个CPU的高速缓存的数据处于这个状态的时候,其它CPU的均不能
2023-05-09 20:25:49 334
转载 1.Java内存模型
JAVA内存模型定义了一个规范啊。那就是每个线程都有一个工作内存,线程操作共享变量的时候需要从主内存读取到工作内存,然后再传递给工作线程使用。共享变量修改后先刷新到工作内存,然后再刷新回主内存。
2023-05-09 20:19:42 67 1
原创 5.java数组
6. 数组、排序和查找1. 名词解释数组:数组可以存放多个同一类型的数据。数组也是一种数据类型,是引用类型。2. 数组的使用2.1 动态初始化数据类型 数组名[] = new 数据类型[大小];例子://第一种动态分配方式double score[] = new double[5];//第二种动态分配方式,先声明数组,再new分配空间double score[];score = new double[4];2.2 静态初始化数据类型 数组名[] = {元素值,元素值…};例子:
2021-12-19 09:53:57 441
原创 递归(汉诺塔
递归(汉诺塔)public class HanNuoTa{ public static void main(String[] args) { T t = new T(); t.move(40,'A','B','C'); System.out.println("结束"); }}class T { //方法 //num 表示要移动的个数,a,b,c分别表示A塔,B塔,C塔 public void move(int num,char a,char b,char c){ //如果
2021-07-05 01:12:19 183
原创 递归(迷宫)
递归(迷宫)public class MiGong{ public static void main(String[] args) { //1. 先创建迷宫,用二维数组表 int map[][] = new int[8][7]; for(int i = 0; i < 7; i++){ map[0][i] = 1; map[7][i] = 1; } for(int i = 0; i < 8; i++){ map[i][0] = 1; map[i][
2021-07-05 01:10:59 96
空空如也
Java通过动态代理生成一个类的子类
2024-07-02
TA创建的收藏夹 TA关注的收藏夹
TA关注的人