线程安全是针对多线程来讲的:
如果所使用的公用变量在多线程下没有被保护机制时,变量结果会和理论值不一致,这就是线程不安全;
相反公用变量在保护机制下工作,就不会出现“随机”变化,这时叫线程安全。
线程安全: 在多线程中使用时,不用自己做同步处理;
线程不安全: 在多线程中使用时,必须做线程同步,不然会有未知后果。
线程的工作原理: JVM有一个main memory,而每个线程有自己的working memory,一个线程对一个variable进行操作时,都要在自己的working memory里面建立一个copy,操作完之后再写入main memory。多个线程同时操作同一个variable,就可能会出现不可预知的结果。
可以用synchronized来解决
Synchronized的关键是建立一个monitor,这个monitor可以是要修改的variable也可以其他你认为合适的object比如method,然后通过给这个monitor加锁来实现线程安全,每个线程在获得这个锁之后,要执行完load到working memory -> use&assign -> store到main memory的过程,才会释放它得到的锁。这样就实现了所谓的线程安全。
例如:
vector线程安全 ArrayList非线程安全,但却节约系统性能:
一个ArrayList类,在添加一个元素的时候,它可能会有两步来完成:
1、在item[size]的位置放此元素;
2、增大size的值
在单线程运行的情况下,如果size=0,添加一个元素后,此元素在位置0,而size=1;
而如果在多线程情况下,比如有两个线程,线程A先将元素存放在位置0。但是此时CPU调度线程A暂停,线程B得到运行的机会。线程B也向此ArrayList添加元素,因为此时Size仍然等于0(注意哦,我们假设的是添加一个元素是要两个步骤,而线程A仅仅完成了步骤1),所以此时线程B也将元素存放在位置0。然后线程A和线程B都继续运行,都增加Size的值。
那好,现在我们来看看ArrayList的情况,元素实际上只有一个,存放在位置0,而size却等于2,这就是"线程不安全"了