自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(13)
  • 收藏
  • 关注

原创 ReentrantReadWriteLock

读锁的释放写锁写锁由于是独占的,和ReentrantLock比较相似,就不额外列出。有个比较有意思的是writeShouldBlock方法,它在这的作用其实就是区分公平锁和非公平锁吧。

2022-07-05 22:42:49 86

原创 Lock以及AQS源码加理解

要使用一个自定义锁,要实现Lock接口,我们可以看到Lock中的方法都是基于Sync这个内部类的。所以自定义锁的时候我也创建了一内部类Sync,继承了AQS。对于AQS,它提供了一堆模板方法,这些方法不需要我们实现,而只有5个方法我们可以重写,那就是:RenntrantLock其实就是一个实现了Lock接口的类。它所做的也是我们上诉所说的实现了一个自定义锁。我们来尝试理解一下lock()这个方法它做了什么,这里先讨论非公平锁,因为默认是非公平锁acquire()公平锁公平锁的区别主要就是在第一次

2022-07-05 21:36:03 76

原创 背包问题总结

#背包问题总结01背包01背包就是m大小的背包中,有n个价值为w,大小为v的物品,选取物品装入背包得到最大值。如果f数组初始化为0,那么f[n][m]就为最大值,如果只有f[0][0]初始化为0,那么只有正好装入的重量才是最大值。朴素解法import java.util.*;class Main { static int n, m; static final int N = 1010; static int[][] f = new int[N][N]; stat

2022-04-11 19:27:49 97

原创 图中点的层次-图宽搜

// 宽搜可以用来解决最小路径问题import java.util.*;class Main{ // 图的初始化操作 static int N = 100010; static int[] h = new int[N], e = new int[N], ne = new int[N]; static int idx = 0; static int n; static int[] d = new int[N]; // 图的插入操作 static voi

2022-03-30 23:15:47 52

原创 树的重心-图的深搜

import java.util.*;class Main { /* 采用邻接表的方法去构件图 */ // 由于是无向图,所以边的个数会是2N static int N = 100010, M = N * 2, idx, n // h代表是头结点的数组,存的是邻接表的链表头指向的那个结点; static int[] h = new int[N]; // 存放的是邻接表对应的图的结点 static int[] e = new int[M]; //

2022-03-30 23:09:37 47

原创 LC140. 单词拆分 II

总体思路采用的是字典树+回溯class Solution { static class Trie { // 这里特别搞笑,居然可以缩小到20;本来设置的是100010的,一看好多人比我快,不行,调试一下哈哈哈 int[][] son = new int[20][26]; int[] cnt = new int[20]; int idx = 0; // insert操作 public void i.

2022-03-28 23:16:08 60

原创 字符串哈希

对应AcWing841import java.util.*;class Main { // 定义一个进制:131 或者13131,这里采用了long,是因为long会自动处理溢出。本来是需要采用膜2^64来处理冲突的 static final int N = 100010, P = 131; static long[] h = new long[N]; static long[] p = new long[N]; // 此处相当于移位 // A

2022-03-28 16:33:27 46

原创 Java堆排序实现+封装

Java堆排序实现+封装对应AcWing838import java.util.*;class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int m = sc.nextInt(); Heap heap = new Heap();

2022-03-28 15:38:47 754

原创 Java并发编程基础

文章目录Java并发编程基础线程优先级线程的状态Daemon线程启动或终止线程启动线程理解中断安全地终止线程线程间通信volatile和synchronized关键字synchronized等待/通知机制等待通知机制的经典范式Java并发编程基础什么是线程:现代操作系统运行一个程序时,会为其创建一个线程。一个进程里可以创建多个线程,这些线程都拥有各自的计数器,堆栈和局部变量等属性,并且能够访问共享的内存变量。处理器在这些线程上高速切换,让使用者感觉到这些线程在同时进行。线程优先级Java线程中通

2022-03-28 11:00:46 281

原创 Java并发机制底层实现-Java内存模型

文章目录Java内存模型提出问题通信同步JMM简易的通信模型从源代码到指令序列的重排序内存屏障Happens before思想重排序数据依赖性as-if-serial程序顺序规则重排序会影响多线程顺序一致性顺序一致性内存模型Type1:线程间正确的同步了Type2:没有同步volatile的内存语义volatile内存语义的实现JSR-133增强了volatile的内存语义锁的内存语义锁内存语义的实现可重入锁reentrantLock公平锁非公平锁为什么CAS可以实现读写volatile的内存语义concu

2022-03-25 14:25:09 619

原创 Java并发机制底层实现-锁升级

文章目录锁升级无锁偏向锁偏向锁的使用过程:轻量级锁轻量锁的加锁轻量锁的释放重量级锁锁升级无锁无竞争情况存在竞争,那就用非锁方式实现同步线程锁标志位为01偏向锁只有一个线程在使用变量Mark Word的前23bit为使用变量的线程ID锁标志位为01偏向锁的使用过程:检查Mark Word里面是否存储着当前线程的ID如果有,那么说明已经获得了锁,直接使用如果没有,测试一下偏向锁的标记是否为1如果没有就直接用CAS去竞争锁如果有就用CAS去尝试把线程的ID换到Mark .

2022-03-22 20:05:20 495

原创 Java并发机制底层实现-synchronized

文章目录synchronized一、synchronized的基础二、实现原理1.代码块同步2.方法同步3.指令细节synchronized一、synchronized的基础Java中的每个对象都有内部锁,都可以作为一个锁;普通同步方法,锁是当前实例对象静态同步方法,锁是当前类的class对象同步方法块,锁是Synchronized括号中配置的对象二、实现原理JVM基于进入和退出Monitor对象来实现方法同步和代码块同步;这个Monitor翻译为监视器,但是可以理解为一个每次只允

2022-03-22 19:22:56 497

原创 Java并发机制底层实现-volatile

Java 并发机制的底层实现volatile文章目录Java 并发机制的底层实现volatile的定义和实现原理一、使用volatile时处理器中做的事(1)Lock前缀指令会引起处理器缓存回写到内存(2)一个处理器的缓存回写到内存会导致其他处理器的缓存无效;二、volatile的使用优化LinkedTransferQueue什么时候不该追加到64字节总结volatile的定义和实现原理java语言规范中对其的定义:Java编程语言允许线程访问共享变量,为了确保共享变量被准确和唯一的更新,线程

2022-03-22 19:03:24 609

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除