synchronized锁的是对象大家都知道,今天写一个小例子测试一下,如果锁的不是同一个对象,锁一定会失效。
场景1:
Synchronized和非synchronized方法可以同时运行,如果在sync执行时间长,而此时同一个对象又调用了非sync方法,就会出现脏读
读锁未加,读线程在写线程未完成的情况下就插入执行,此时数据脏读。
解决:加读锁,此时锁住同一个对象,读写互斥。
场景2:如何确定是锁定是统一对象?
我们来测试一下,新建对象读取,此时是加了读写锁的,但是仍锁不住。
————————————————
如果锁定的对象为空,会空指针
synchronized锁注意事项
1.粒度小
2.用对象做锁的时候用final修饰,防止其他位置对其重新初始化(final可以使用反射来改)
3.不要用string来当锁,如果程序jar或其他地方也用了同一个字符串当锁,会出问题
synchronized的使用方法:
1.实例方法 锁当前实例对象,如果当前对象有多个实例,多个实例同时调用一个加锁方法,不受影响
2.静态方法 类级别的,只要是一个类的对象,不管有几个实例,锁对所有实例有效
3.代码块 如果锁当前实例对象 同实例方法,如果锁是类对象,同静态方法级别
关于锁还有很多,后续我会继续总结。