最新Java面试题及答案整理
1、多个thread对同一个java实例的访问(read和modify)不会相互干扰,它主要体现在关键字synchronized。如ArrayList和Vector,HashMap和Hashtable(后者每个方法前都有synchronized关键字)。如果你在interator一个List对象时,其它线程remove一个element,问题就出现了。 2、每个线程都有自己的字段,而不会在多个线程之间共享。它主要体现在java.lang.ThreadLocal类,而没有Java关键字支持,如像static、transient那样。 volatile 实现原理 聊聊并发(一)——深入分析Volatile的实现原理 悲观锁 乐观锁 乐观锁 悲观锁 是一种思想。可以用在很多方面。 比如数据库方面。 悲观锁就是for update(锁定查询的行) 乐观锁就是 version字段(比较跟上一次的版本号,如果一样则更新,如果失败则要重复读-比较-写的操作。) JDK方面: 悲观锁就是sync 乐观锁就是原子类(内部使用CAS实现) 本质来说,就是悲观锁认为总会有人抢我的。 乐观锁就认为,基本没人抢。 CAS 乐观锁 乐观锁是一种思想,即认为读多写少,遇到并发写的可能性比较低,所以采取在写时先读出当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新),如果失败则要重复读-比较-写的操作。 CAS是一种更新的原子操作,比较当前值跟传入值是否一样,一样则更新,否则失败。 CAS顶多算是乐观锁写那一步操作的一种实现方式罢了,不用CAS自己加锁也是可以的。 ABA 问题 ABA:如果另一个线程修改V值假设原来是A,先修改成B,再修改回成A,当前线程的CAS操作无法分辨当前V值是否发生过变化。 参考: Java CAS 和ABA问题 乐观锁的业务场景及实现方式 乐观锁(Optimistic Lock): (编辑:重庆站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |