线程安全问题?
原书里面给的定义:某个类的行为与其规范完全一致。(反过来说,就是竞态条件下,类的方法不会出现预料以外的结果)
那么什么时候会出现类的行为与其规范不一致?
- 竞态 Java提供了多线程,也就是说任意方法都会被并发访问,但又不是所有方法都会被多个线程并发访问到(如果以我自己经验来说,也就单例的getInstance方法有可能会被多线程并发调用);
所以第一步应该明确自己业务中哪些方法的调用会存在竞态; - 竞态下资源更新
如果这个方法存在竞态,而该方法本身又不涉及到更新操作,比如:pubulic int get() { return 1; }这个方法就算被N个线程并发访问,也不会有安全问题。。。 如果返回的是一个final类型的,也不会有安全问题。。。
如果一个方法本身涉及到一个资源的更新(类中某个变量的赋值、修改之类的操作),出现了竞态,那么就有可能出现线程安全问题;
比如前一篇中的情况就是线程不安全的;
- 竞态下不可避免的资源更新——同步 如果一个方法存在竞态,可以尽量将更新的资源放到外面;如果不可避免,则需要使用同步; 在前一篇里面使用了synchronized实现同步,实际上还有volatile、Atomic、ReentrantLock同步机制。