如何在两个线程之间共享数据
Java 里面进行多线程通信的主要方式就是共享内存的方式,共享内存主要的关注点有两个:可见性和有序性原子性。Java 内存模型(JMM)解决了可见性和有序性的问题,而锁解决了原子性的问题, 理想情况下我们希望做到“同步”和“互斥”。 有以下常规实现方法:
1、将数据抽象成一个类,并将数据的操作作为这个类的方法。
将数据抽象成一个类,并将对这个数据的操作作为这个类的方法,只要在方法上加” synchronized“数据访问即可。
对该案例执行4次,结果分别不同:
1)【-1,0,-1,0】,先减1再加1再减1再加1,最后结果0
2)【-1,0,1,0】,先减1再加1再加1再减1,最后结果0
3)【-1,-2,-1,0】,先减1再减1再加1再加1,最后结果0
4)【1,2,1,0】,先加1再加1再减1再减1,最后结果0
四次随机结果将线程执行的各种组合均呈现,最后结果都是0。
2、Runnable 对象作为一个类的内部类
将 Runnable 对象作为一个类的内部类,共享数据作为这个类的成员变量,每个线程对共享数据的操作方法也封装在外部类,以便实现对数据的各个操作的同步和互斥,作为内部类的各个 Runnable 对象调用外部类的这些方法。
此测试案例中使用的是匿名内部类,总体而言与第一种方法似乎没有区别。