本文讲解的是关于java成员变量的线程安全问题,包括静态变量和实例变量。静态变量好理解,所有实例都共享一份内存,任何对静态变量的修改都会引发线程安全问题。然而,对于实例变量,在大多数情况下的访问和修改都是线程安全的。但是,当这个类,在系统里面被实现为单例模式时,由于整个系统中,只存在一份对象内存,所以,系统的各线程对该实例变量的修改则又会引发线程安全问题。这种情况别说是java新手容易犯的疏忽,就算是有一定经验的java程序员也会不小心地犯错,况且,有些时候由于知识范围或者其他原因,程序员根本不知道正在使用的实例就是一个单例(比如,从工厂中获取到的实例、struts1中的action、spring容器中默认的scope就是singleton等等)。
下面使用代码对此说明。代码由三个类组成:FieldsVo 包含有两个成员变量(静态和实例的)用于在多线程中访问、FieldValueWatcher继承自Thread用于模拟对FieldsVo 类的访问、Test测试类。
先来看看第一个VO类,很简单,只有两个成员变量:静态和实例,和两个对应的修改器和访问器
线程检测类:FieldValueWatcher