首先要明白线程的工作原理,jvm有一个main memory,而每个线程有自己的working memory,一个线程对一个variable进行操作时,都要在自己的working memory里面建立一个copy,操作完之后再写入main memory。多个线程同时操作同一个variable,就可能会出现不可预知的结果。根据上面的解释,很容易想出相应的scenario。
而用synchronized的关键是建立一个monitor,这个monitor可以是要修改的variable也可以其他你认为合适的object比如method,然后通过给这个monitor加锁来实现线程安全,每个线程在获得这个锁之后,要执行完 load到workingmemory -> use&assign -> store到mainmemory 的过程,才会释放它得到的锁。这样就实现了所谓的线程安全。
例如:ArrayList 和Vector是采用数组方式存储数据,如果是开多个线程对ArrayList进行写操作其结果是不可预料的,而Vector由于使用了synchronized方法(线程安全),也就是A线程写完之后才B线程写。在性能上比ArrayList要差。
可以总结为:多个线程可以同时写操作一块内存,那就是非多线程安全的。线程安全就是在多线程环境下也不会出现数据不一致,而非线程安全就有肯能出现数据不一致,线程安全的类由于要确保线程安全增加了一定的开销,所以在单线程环境中效率没非线程安全的类效率高。