![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
提升学习
原力与你同在
我,最后的绝地武士
展开
-
java多线程常见工具类使用
java多线程场景工具类使用CountDownLatch使用CyclicBarrier使用Exchanger使用Semaphore信号量Condition交替打印123,共10次线程main、线程0、线程1按照顺序依次执行线程池内部线程执行任务报错处理execute提交的任务(无返回值)submit提交的任务报错CountDownLatch使用import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorS原创 2022-05-05 14:12:27 · 2004 阅读 · 0 评论 -
shell学习
shell学习输出hello world运行shell有两种方法输出hello world// 指定用/bin/bash下的解释器来执行#!/bin/bashecho "Hello World !"运行shell有两种方法1、作为可执行程序chmod +x ./test.sh #使脚本具有执行权限./test.sh #执行脚本2、作为解释器参数// 选用/bin/sh下的解释器执行 test.sh文件/bin/sh test.sh...原创 2021-12-16 10:02:44 · 1475 阅读 · 0 评论 -
Jave实现链表反转
链表:1->2->3->4->null反转后:null<-1<-2<-3<-4需要一个node记录反转后的head,定义为pre需要一个记录当前node的后续node,防止丢失,定义为temp当前的head一直向后移动,为head最后返回pre// 定义nodeclass Node { int data; Node next; Node(int data) { this.data = data; }原创 2021-11-26 12:19:27 · 414 阅读 · 0 评论 -
volitate关键字
先占个坑,好好补原创 2021-05-28 10:37:16 · 3039 阅读 · 0 评论 -
ReadWriteLock的实现原理
ReadWriteLock成为读写锁,事java并发包下的一个类,该锁包括读锁和写锁。其中读锁之间采用共享式获取锁资源,读线程之间互不影响;如果有线程获取了读锁,那么写锁则会获取失败;如果有线程获取了写锁,则读锁获取失败(非同一线程),写锁是可重入锁,也是独占锁。读写锁的共享资源是4个字节的int类型,高16位表示读锁数;低16位表示写锁次数。00000000 00000000 00000000 00000000c:=0 读写锁都没有 w:=0 读锁没有 r:=写锁没有00000000 0000000原创 2021-05-27 10:44:14 · 576 阅读 · 0 评论 -
CopyOnWriteArrayList
CopyOnWriteArrayList是线程安全的并发容器,适合读多写少的场景,是一种读写分离的并发策略,读操作是无锁的。来看下这张图:优点:适用于读多写少的场景,读效率很高;缺点:有写操作时,需要复制一份,占用内存,而且时效性不强(写时读的依然时老数据)看看这个类的属性: // 锁 final transient ReentrantLock lock = new ReentrantLock(); // volatile修饰,保证可见性 private transien原创 2021-05-25 10:42:02 · 73 阅读 · 0 评论 -
ReentrantReadWriteLock读写锁源码学习
ReentrantReadWriteLock锁的属性如下 // 这里持有了读锁 private final ReentrantReadWriteLock.ReadLock readerLock; // 这里持有了写锁 private final ReentrantReadWriteLock.WriteLock writerLock; // 内部同步类 final Sync sync;ReentrantReadWriteLock的构造函数如下 public R原创 2021-05-14 21:11:48 · 64 阅读 · 0 评论 -
原子类AtomicInteger常用api
原子类AtomicInteger在多线程场景下用处很多,来看下这个类构造函数 // 给定初始值 public AtomicInteger(int initialValue) { value = initialValue; } // 无参构造 public AtomicInteger() { }注意到静态代码块 static { try { // 初始是0 valueOffset = unsa原创 2021-05-14 16:47:23 · 325 阅读 · 0 评论 -
CountDownLatch源码分析
countDownLatch是一个计数器,线程完成一个记录一个,计数器递减,只能只用一次。查看CountDownLatch的构造函数 // 传入一个大于0的资源信息 public CountDownLatch(int count) { if (count < 0) throw new IllegalArgumentException("count < 0"); this.sync = new Sync(count); }内部持有一个静态内部类,作原创 2021-05-14 16:14:58 · 100 阅读 · 0 评论 -
ReentrantLock源码分析
上一篇文章重点分析了AQS的源码,有了这个认识,我们再看ReentrantLock的源码,会简单很多,来看下这个类 // 创建一个锁 ReentrantLock lock = new ReentrantLock(); // 默认是非公平锁,提升效率 public ReentrantLock() { sync = new NonfairSync(); } // 属性 private final Sync sync;看下Sync这个ReentrantLo原创 2021-05-14 15:42:24 · 48 阅读 · 0 评论 -
AQS源码学习
AQS(全称AbstractQueuedSynchronizer抽象队列同步器)作为juc包下重要的基础类,是实现其他并发工具的基础类,来学习下AQS源码先看看类继承结构,AQS继承了AbstractOwnableSynchronizer这个类AbstractOwnableSynchronizer类的结构如下public abstract class AbstractOwnableSynchronizer implements java.io.Serializable { priv原创 2021-05-14 11:02:24 · 138 阅读 · 0 评论 -
HashMap源码学习(java8版)
hashMap从7到8变化还是比较大,看下hashMap的源码创建一个HashMapHashMap map = new HashMap();看看HashMap的一些常量 // 默认初始化容量 1左移4位,也就是16 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // 最大容量,1左移30位,也就是1073741824,大概10.7亿 static final int MAXIMUM_CAPACITY =原创 2021-05-13 19:06:42 · 90 阅读 · 1 评论 -
LinkedList源码学习
创建一个listLinkedList list = new LinkedList();看看LinkedList的属性 // 元素个数 transient int size = 0; // 头节点 transient Node<E> first; // 尾节点 transient Node<E> last; // 持有了一个内部静态类Node private static class Node<E> { // 数据原创 2021-05-13 17:57:13 · 58 阅读 · 0 评论 -
ArrayList源码学习
// 创建一个list ArrayList list = new ArrayList(); // 默认容量 private static final int DEFAULT_CAPACITY = 10; // 空元素的数组 private static final Object[] EMPTY_ELEMENTDATA = {}; // 默认容量空,空元素数据 private static final Object[] DEFAULTCAPACITY_EMPTY_E.原创 2021-05-13 17:26:56 · 54 阅读 · 0 评论