线程安全?如何实现?
如果你的代码所在的进程中有多个线程在同时运⾏,⽽这些线程可能会同时运⾏这段代码。如果每次运⾏结果和[单线程]运⾏的结果是⼀样的,⽽且其他的变量的值也和预期的是⼀样的,就是线程安全的。
线程安全问题都是由[全局变量及[静态变量]引起的。
若每个线程中对全局变量、静态变量只有读操作,⽽⽆写操作,⼀般来说,这个全局变量是线程安全的;若有多个线程同时执⾏写操作,⼀般都需要考虑[线程同步],否则的话就可能影响线程安全。
对于线程不安全的对象我们可以通过如下⽅法来实现线程安全:
① 加锁 利⽤Synchronized或者ReenTrantLock来对不安全对象进⾏加锁,来实现线程执⾏的串⾏化,从⽽保证多线程同时操作对象的安全性,⼀个是语法层 ⾯的互斥锁,⼀个是API层⾯的互斥锁. ② ⾮阻塞同步来实现线程安全。原理就是:通俗点讲,就是先进性操作,如果没有其他线程争⽤共享数据,那操作就成功了;如果共享数据有争⽤,产⽣冲突,那就再采取其他措施(最常⻅的措施就是不断地重试,知道成功为⽌)。这种⽅法需要硬件的⽀持,因为我们需要操作和冲突检测这两个步骤具备原⼦性。通常这种指令包括CAS SC,FAI TAS等。 ③ 线程本地化,⼀种⽆同步的⽅案,就是利⽤Threadlocal来为每⼀个线程创造⼀个共享变量的副本来(副本之间是⽆关的)避免⼏个线程同时操作⼀个对象时发⽣线程安全问题。
Last updated