美文网首页
基于CAS的一些锁(7)- Exchanger

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

作者: silence_J | 来源:发表于2020-05-09 18:40 被阅读0次

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

      本文链接:https://www.haomeiwen.com/subject/dwwknhtx.html