锁对象用final修饰,保证不能被修改,是出于安全考虑。
因为synchronized的原理是,操作对象头的mark word,而和锁对象的类型没有关系。
如果锁对象不用final修饰,就可能出现这种情况:
-
一个线程获取了锁对象,它内部可以对锁对象重新赋值,比如新建一个对象作为锁对象
-
这个新的实例对象,没有上次的锁信息,相当于锁被释放了
-
新的线程就会和之前的线程并行操作同步块,产生竞态条件,造成完全不可控的线程安全问题。
锁对象用final修饰,保证不能被修改,是出于安全考虑。
因为synchronized的原理是,操作对象头的mark word,而和锁对象的类型没有关系。
如果锁对象不用final修饰,就可能出现这种情况:
一个线程获取了锁对象,它内部可以对锁对象重新赋值,比如新建一个对象作为锁对象
这个新的实例对象,没有上次的锁信息,相当于锁被释放了
新的线程就会和之前的线程并行操作同步块,产生竞态条件,造成完全不可控的线程安全问题。