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

2020-05-09  本文已影响0人  silence_J

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同步工具做一个简单总结。

上一篇 下一篇

猜你喜欢

热点阅读