使用passion关键字增加了多线程中实例变量的可见性。但是volition有一个致命的缺点,就是不支持原子性。
我们来对比一下volition和synchronized关键词:
1.volition是线程同步之间的轻量级实现,所以volition的性能肯定比synchronized好,而且volition只能修改变量。
2.多线程访问意志不会阻塞,而同步会阻塞。
3 .意志可以保证数据的可见性,但不能保证原子性;同步不仅可以保证原子性,还可以间接保证可见性。
4.再次,关键字volition解决了多线程之间变量的可见性;synchronized关键字解决了多线程之间访问资源的同步问题。
线程安全包括原子性和可见性,java的同步机制围绕这两个方面来保证线程安全。
关键字volition的主要用途是多线程可以感知到共享变量发生了变化,可以获得最新的值,即共享变量可以被多线程读取,获得最新的值。
关键字volition提示线程每次从共享内存中读取变量,而不是从私有内存中读取,从而保证了数据的可见性。
但需要注意的是,如果代码中有i++,即i=i+1,这样的操作就不是原子操作,即不是线程安全的。具体来说,你可以理解i++的实际意义;
①从存储器中读取变量I。
②计算I的值。
③将I的值写入内存。
如果两个线程同时执行这段代码,可能会出现脏数据,解决方法是添加同步字。
其实除了synchronized,也可以用原子类来解决。
这个可以代替i++,不加同步锁。
此外,synchronized关键字还可以确保数据可见性。
最后,学习多线程八字经“外修互斥,内修可见”