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