基于CAS的一些锁(7)- Exchanger

Exchanger 交换器,用于两个线程之间交换数据。

可以把exchanger想象成一个容器,这个容器有两个值,两个线程,有两个格的位置,第一个线程执行到exchanger.exchange的时候,阻塞,但是要注意exchange方法执行时是往里面传了一个值的,你可以认为把T1扔到第一个格子了,然后第二个线程开始执行,也执行到exchange,他把自己的值T2扔到第二个格子里。接下来这两个值交换一下,T1扔给T2,T2扔给T1,两个线程继续往前运行。

exchange只能是两个线程之间,交换只能两两进行。游戏中两人交易时就可以使用。

Exchanger工作原理.png
public class T07_Exchanger {// 泛型指定交换类型static Exchanger<String> exchanger = new Exchanger<>();public static void main(String[] args) {new Thread(() -> {String s = "T1";try {// 传入需要交换的对象s,返回交换后的对象s = exchanger.exchange(s);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + " " + s);}, "t1").start();new Thread(() -> {String s = "T2";try {// 传入需要交换的对象s,返回交换后的对象s = exchanger.exchange(s);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + " " + s);}, "t2").start();}}

总结

这里对之前写过的一些juc同步工具做一个简单总结。

  • ReentrantLock和synchronized的区别:ReentrantLock 有tryLock(),lockInterruptibly()等方法,用起来更灵活,更方便。
  • CountDownLatch门闩,就是倒计时,什么时候计数完了,门闩打开,程序继续往下执行。
  • CycliBarrier一个栅栏,循环使用,什么时候人满了,栅栏打开放行。
  • Phaser分阶段的栅栏。
  • ReadWriteLock读写锁,读锁共享,写锁排他,重点掌握。
  • Semaphore信号标,限流用的。
  • Exchanger交换器,两个线程之间交换数据。

基于CAS的一些锁(7)- Exchanger

Exchanger 交换器,用于两个线程之间交换数据。

可以把exchanger想象成一个容器,这个容器有两个值,两个线程,有两个格的位置,第一个线程执行到exchanger.exchange的时候,阻塞,但是要注意exchange方法执行时是往里面传了一个值的,你可以认为把T1扔到第一个格子了,然后第二个线程开始执行,也执行到exchange,他把自己的值T2扔到第二个格子里。接下来这两个值交换一下,T1扔给T2,T2扔给T1,两个线程继续往前运行。

exchange只能是两个线程之间,交换只能两两进行。游戏中两人交易时就可以使用。

Exchanger工作原理.png
public class T07_Exchanger {// 泛型指定交换类型static Exchanger<String> exchanger = new Exchanger<>();public static void main(String[] args) {new Thread(() -> {String s = "T1";try {// 传入需要交换的对象s,返回交换后的对象s = exchanger.exchange(s);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + " " + s);}, "t1").start();new Thread(() -> {String s = "T2";try {// 传入需要交换的对象s,返回交换后的对象s = exchanger.exchange(s);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + " " + s);}, "t2").start();}}

总结

这里对之前写过的一些juc同步工具做一个简单总结。

  • ReentrantLock和synchronized的区别:ReentrantLock 有tryLock(),lockInterruptibly()等方法,用起来更灵活,更方便。
  • CountDownLatch门闩,就是倒计时,什么时候计数完了,门闩打开,程序继续往下执行。
  • CycliBarrier一个栅栏,循环使用,什么时候人满了,栅栏打开放行。
  • Phaser分阶段的栅栏。
  • ReadWriteLock读写锁,读锁共享,写锁排他,重点掌握。
  • Semaphore信号标,限流用的。
  • Exchanger交换器,两个线程之间交换数据。