Atmic和线程同步新机制
ReentrantLock
可重入锁ReentrantLock
ReentrantLlock是可以替代synchronized的,原来写synchronized的地方换上lock.lock(),加完锁之后需要注意的是记得lock.unlock()手动解锁。
lock.lock()写在try.....catch里面
ReentranLock有一些功能还是要币synchronized强大的,强大的地方,你可以用tryLock进行尝试锁定,不管锁定与否,方法都将继续执行,synchronized如果搞不定的话它肯定阻塞了。
ReentrantLock还可以指定为公平锁。(synchronized只有不公平锁)
(公平的意思是:就像排队一样谁在前面谁先执行)
ReentrantLock可以替代synchronized,它也可以重入,可以锁定,它的底层是cas。
ReentrantLock:需要手动加锁,手动解锁、可以出现多个不同的等待队列、CLS的实现
CountDownLatch
CountDown(倒数)Latch(门栓)
假如我new了100个线程,又来了100个数量的CountDownLatch,就是一个门栓,门栓上记了个数threads.length是100,每一个线程结束的时候我latch.countDown(),然后所有的线程start(),再latch.await(),最后结束。每个线程执行到latch.await()的时候这个门栓就在这里等着,并且记了个数100,每一个线程结束的时候都会往下CountDown,CountDown是在原来的基础上减1,一直到这个数字变成0的时候门栓就会被打开,它是用来等线程结束的。
CyclicBarrier
同步工具CyclicBarrier,意思是循环栅栏。比如这有一个栅栏,什么时候人满了就把栅栏推到,把人都放出去,出去之后又重新把栅栏扎起来,再来人,满了,推倒后继续。
Phaser
Phaser它更像结合了CountDownLatch和CyclicBarrier,叫阶段。
Phaser是按照不同的阶段来对线程执行的,就是它本身是维护着一个阶段这样的一个成员变量,当前我是执行到那个阶段,是第0个,还是第一个等等,每个阶段不同的时候这个线程都可以往前走,有的线程走到某个阶段就停了,有的线程一直会走到结束。
ReadWriteLock
这个ReadWriteLock是读写锁。读写锁的概念就是共享锁(读锁)和排他锁(写锁)。
当读线程上来的时候加一把锁是允许其它读线程可以读,写线程来了我不给它,你先别写,等我读完你再写。读线程进来的时候我们大家一块读,因为你不改原来的内容,写线程上来把整个线程全锁定,你先不要读,等我写完你再读。
Semaphore
Semaphore(信号灯),可以往里面传一个数,permits是允许的数量,你可以想着有几盏信号灯,一个灯里面闪着数字表示到底允许几个来参考我这个信号灯。
s.acquire()这个方法叫做阻塞方法,阻塞方法就是说我大概acquire不到的话我就停在这里,acquire的意思就是得到。Semaphore的含义是限流。
默认Semaphore是非公平的,new Semaphore(2.true)第二个值true才是设置公平。
Exchanger
Exchanger叫做交换器,就是线程之间交换数据用的。
(