携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第30天,点击查看活动详情
写了很多单线程的文章,从这篇开始我们来了解一下多线程,那本篇文章呢带大家了解一下线程间的通讯。
方法间的通讯
如果两个方法之间要通讯,那应该怎么做呢?无非就是一个方法的输出作为另一个方法的输入,其实好多软件方面的东西,都来自硬件,画个图可以帮助大家理解:
线程间的通讯
线程间的通讯能不能这样做呢?我们来做个实验代码,我们搞两个线程,给个标识,作为一个线程的结束,另一个线程的开始,此标识作为共享变量给两个线程,实验代码如下:
我们发现结果是:通讯失败
我们来分析一下这段代码的问题啊,就是说每个线程都是独立的,每个线程都会创建一个线程栈,线程栈上有这个共享变量的副本,线程和线程1都有这个副本,但线程1修改副本之后写入内存,线程2才能执行,但线程1是在线程先执行后才执行的,所以线程需要在线程1执行完再执行。
我们修改一个我们的代码:
运行结果如下:
这个让线程等待的方法有很多,比如可以执行打印,就像下面这样:
运行结果如下:
还可以怎么样?加同步代码块试试:
测试结果如下:
很诡异是叭!学好多线程是很不容易的事情,我们继续努力叭!
总结
那么为啥上面三种方法会生效呢?本质上就是利用了sychronized的可见性,防止指令重排,当这个代码从同步锁走出之后,就会刷内存。