JUC
文章平均质量分 63
Java充电桩
这个作者很懒,什么都没留下…
展开
-
synchronized详情 锁属性 锁方法 锁类 ,可重入不公平锁 锁优化
最近复习一下基础,查缺补漏,输出倒逼一下输入. 以后忘了再来翻翻,看看自己输出的怎么样,反复卤煮好吧!首先是几个基本特性:一把锁只能被一个线程获取, 一旦被获取后, 其他的线程只能等待,锁释放后才可重新获取.每个实例对象都有各自的锁, 不同实例对象互补影响,除非两种特殊情况,一种是直接锁在类上(*.class),或者是用synchronized修饰的static静态方法,这时的对象就是共用一把锁synchronized修饰的方法, 不管是正常流程结束,还是抛异常,都会释放锁.然后是原创 2022-04-01 18:17:51 · 544 阅读 · 0 评论 -
Runnable 与 Callable 的区别,引申FutureTask
在早期的学习过程中,创建线程一般常用的就是实现Runnable接口,但这样在日渐壮大的场景中,已经不足以使用了,于是就诞生了Callable。实现Runnable()class MyRun implements Runnable{ @Override public void run() { System.out.println("come in runnable"); }}实现Callable()class MyCall implements Callabl原创 2021-03-30 07:44:18 · 111 阅读 · 0 评论 -
可重入锁ReentrantLock(同递归锁) 之 公不公平锁?Lock与synchronized对比
上回书集合中说到,写时读集合中会先用锁,锁上在操作,用的就是可重入锁ReentrantLock()。这个锁有两个构造方法,一个空构造默认方法生成一个不(非)公平锁。一个boolean类型的单参赛构造方法,为true时生成公平锁,为false时同空构造。公平锁公平锁讲究先来后到,挨个排队,一个个来,像我们排队买饭一个道理非公平锁谁先抢到就是谁的,类似抢绣球,总不能给排队好,直接送第一个吧?绣球就直接白给吧!毕竟小姐就一个,绣球自然也只有一个,谁能抢到就嫁谁!当然这只是比喻,不是让你一个一个来跟原创 2021-03-25 16:01:24 · 114 阅读 · 0 评论 -
线程通信 传统老版本1.0 /Lock锁控制2.0 /阻塞队列3.0
大家最开始学多线程的时候一定学过生产者与消费者,比如生产包子和买包子。传统老版本1.0入门的时候是通过synchronized来锁住线程,用wait来进行等待,用notify来唤醒。Lock锁控制2.0但是这套方法已经过时,自从有了JUC以后,就可以将其升级为更灵活的版本2.0阻塞队列3.0当然有阻塞队列后就更简单了,当队列中有值时,才能取,这不就是完美的解决方法吗!而且简单粗暴,无需判断与加锁。一般用offer的三参构造,能进行灵活的锁定与判断操作boolean offer(E e, lo原创 2021-03-29 17:33:23 · 64 阅读 · 0 评论 -
读写锁ReentrantReadWriteLock
读写操作一般分为三种ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();1. 读+读,共享锁rwlock.readLock().lock()共享锁,锁住的内存,其他线程依然可读,做到资源共享,其他人来访问并不影响,无需阻塞rwLock.readLock.().unlock()2. 读+写,独占锁rwLock.writeLock().lock();独占锁,一次只有一个线程可以进行写操作,其他线程不可参与进来rwLock.w原创 2021-03-26 13:01:29 · 82 阅读 · 0 评论 -
volatile 是什么?指令重排是什么?JMM模型三大特性?DCL双端检锁?
volatile 可以理解为乞丐版的synchronized,唯一差的一点就是原子性!volatile三大特性:1.可见性顺带一提数据一般存储在内存中,如nosql的redis,而像mysql这样的数据则存在硬盘,CPU则只是负责运算。所以数据的读取熟读为:硬盘<内存<CPU简单说一下线程工作原理,先去内存读取数据,然后将数据获取复制到线程的工作空间,将数据处理完毕后,才会重新写入内存,内存收到新写入的数据后,会通知其他的线程,数据变了!你们要拷贝数据,记得拷贝新数据哦!这就是原创 2021-03-22 11:11:48 · 128 阅读 · 0 评论 -
CAS是什么?ABA是什么?原子引用?
CAS即compareAndSet,比较并交换如原子型整数,AtomicInterger中就有一个compareAndSet(expect,update)方法,输入一个期望值expect,和一个更新值update,如果atomicInterger=expect,则重新赋值为update,并返回true。如果值已经被改动,则返回false,不进行操作。...原创 2021-03-23 13:41:31 · 133 阅读 · 0 评论