线程安全问题出现的条件:
1. 必须要存在两个或者两个以上的线程共享同一个资源(代码块)。
2. 被共享的资源代码块语句必须有两句或者两句以上。
线程安全出现的原因:
1.操作系统方面:对线程的调度,是抢占式执行的随机过程。
2.代码结构:多线程同时修改同一个变量。
3 .CPU的修改操作不是原子性的。
4.内存的可见性。程序运行时,出现一个线程修改内存,一个线程读取内存过程中,由于JVM自动优化出现误判引起的。
5.指令重排序。
解决方案:
通过加锁的方式来解决,用synchronized(){}方式。
即通过关键字synchronized,将锁对象锁定在(),使执行的代码块{}打包成一个整体代码执行。被锁定对象进入代码块开始到代码块执行完成,整个过程像一条指令执行,不会被打断,直到代码块执行完毕(return/抛出异常),被锁定对象才被解锁。
如果一个线程对某对象加了锁,而另外一个线程也企图对该对象加锁,就会出现“阻塞”(锁竞争/锁冲突)。