锁的API及多线程性能调优
轮询锁
trylock方法尝试获取锁,如果获取了结果就是true,执行目标代码,如果没有就继续尝试获取(放入while循环中可以做其他事),还可以采用中断锁。
中断锁
线程的isInterrupted方法可以检查是否处于中断状态,interrupted可以将线程的中断标记设置为true,在调用join,sleep,wait都会检查中断标记,如果被中断了就立即抛出interruptedexception,并把中断标记置位false。
lock有一个lockinterruptibly方法可以尝试获取锁,如果没获取到进入了阻塞状态,就可以让其他线程中断该线程,该线程就立即抛出interruptexception异常,并且清除线程的中断状态。
(lockinterruptibly方法可以中断等待锁的线程,这是与隐式锁的重要区别之一)
定时锁
定时锁trylock,可以设置时间,在指定时间内获取了锁就返回true,否则false,如果等待过程中线程被中断也会抛出异常。
读写锁
读写锁,reentrantreadwritelock,可以调用readlock方法获得读锁,writelock获得写锁,调用lock和unlock方法,读锁可以允许其他读锁共同持有,但不允许写锁,是共享锁,写锁不允许其他锁占用,是互斥锁。
多线程的性能调优
减少锁的范围:尽量把不需要同步的代码放到同步外
减少锁的粒度:把原来用一个锁同步的方法分散成两个不同的锁,这样就可以减少锁的竞争带来的性能损失,要注意这两个锁同步的字段必须是相互独立不存在任何不变性条件的
锁分段:本来map是一个多项数据构成的集合,防止并发问题可以用一个锁来锁住全部数据,也可以分段n个数据分成n把锁一一对应,这样就可以减少锁竞争的激烈程度优化性能,但是如果要插入或删除某个元素时要一次性获取多把锁,对性能不利