警惕!String的”+”操作是非线程安全的

11月 24, 2014 |

昨天我发表了一篇名为《从字节码角度看String的连接操作》的博文,我提到String的"+"操作是非线程安全的,有网友给我留言能否提供一个证实String的"+"操作是非线程安全的的例子,所以今天用例子来证实这个结论。
假设有这样的示例代码:

示例很简单,启动了THREAD_SIZE个线程,每个线程调用map.s +="|"向该字符串中追加一个'|',如果是线程安全的,那么等所以线程结束后,那么s的长度应该等于THREAD_SIZE,当我们通过反复的运行该示例发现,大多数时候字符串s的长度都不等于线程的数目,从而说明该操作是非线程安全的。
如果大家知道String的"+"操作的原理,相信对这个结论一点都不惊讶,如果不熟悉可以看看我的上篇博文,很简单也不会耽误太多的时间,可能你要问,要是我想要字符串的连接操作是线程安全的,那么该怎么改呢,其一可以自己使用synchronized进行代码块的同步,其二是将字符串的连接操作使用StringBuffer对象进行,其实我示例中注释掉的代码就是使用StringBuffer的版本,无论你运行多少次,那么输出的都是"correct"

Posted in: java基础

Comments are closed.