线程安全问题的发生
多个线程同时访问一个资源时,会导致程序运行结果并不是想看到的结果,这个就是线程安全问题;这里面的资源被称为临界资源或者说共享资源。也就是说,当多个线程同时访问临界资源时,就可能会产生线程安全问题。
不过,当多个线程执行一个方法,方法内部的局部变量并不是临界资源,因为方法是在栈上执行的,而Java栈是线程私有的,因此不会产生线程安全问题。
如何解决线程安全问题
基本上所有的并发模式在解决线程安全问题时,都采用“序列化访问临界资源”的方案,即在同一时刻,只能有一个线程访问临界资源,也称作同步互斥访问。
通常来说,是在访问临界资源的代码前面加上一个锁,当访问完临界资源后释放锁,让其他线程继续访问。在Java中,提供了两种方式来实现同步互斥访问:synchronized和Lock。