1. 锁的优化有哪些手段?java
(1)下降 锁 的范围 例如:将方法上的锁能够加到 代码快上安全
(2)锁分离:读读之间不须要同步,读写和写写之间才须要同步,例如:读写锁多线程
锁分离延伸:只要操做互不影响,就能够锁分离,例如 LinkedBlockingQuene并发
(3)减小锁力度:将一个大对象拆分红对个小对象,每一个小对象能够被一个线程访问,例子:CurrentHashMap性能
(4)锁粗化:为了保证多线程间的有效并发,会要求每一个线程持有锁的时间尽可能短,即在使用完 公共资源后,应该当即释放锁。只有这样,等待在这个锁上的其余线程才能尽早的得到资源执行 任务。可是,凡事都有一个度,若是对同一个锁不停的进行请求、同步和释放,其自己也会消耗 系统宝贵的资源,反而不利于性能的优化优化
例子:for循环中 锁 加在循环外比 加载循环里 好spa
public void demoMethod(){ synchronized(lock){ //do sth. } //作其余不须要的同步的工做,但能很快执行完毕 synchronized(lock){ //do sth. } }
==》粗化:线程
==》粗化code
(5)锁消除:在即时编译器时,若是发现不可能被共享的对象,则能够消除这些对象的锁操做对象
名称:不可被共享的对象(方法中声名的对象,且没有越界:没有将该对象return)
例如:StringBuffer不可被共享,但StringBuffer是线程安全的,全部须要去掉锁
2. 什么是大对象?
答:多个线程须要同时访问的对象
3. 锁消除是在哪儿作?
答:在 JVM中