lock和synchronized的区别

与synchronized类似的,lock也能够达到同步的效果

Lock是一个接口,为了使用一个Lock对象,需要用到

Lock lock = new ReentrantLock();
 
 lock必须调用unlock方法进行手动释放,为了保证释放的执行,往往会把unlock() 放在finally中进行。
 
synchronized 是不占用到手不罢休的,会一直试图占用下去。
与 synchronized 的钻牛角尖不一样,Lock接口还提供了一个trylock方法。
trylock会在指定时间范围内试图占用,占成功了,就啪啪啪。 如果时间到了,还占用不成功,扭头就走
locked = lock.tryLock(1,TimeUnit.SECONDS);
 
使用synchronized方式进行线程交互,用到的是同步对象的wait,notify和notifyAll方法
Lock也提供了类似的解决办法,首先通过lock对象得到一个Condition对象,然后分别调用这个Condition对象的:await, signal,signalAll 方法
 
总结Lock和synchronized的区别:
 
1. Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现,Lock是代码层面的实现。

2. Lock可以选择性的获取锁,如果一段时间获取不到,可以放弃。synchronized不行,会一根筋一直获取下去。 借助Lock的这个特性,就能够规避死锁,synchronized必须通过谨慎和良好的设计,才能减少死锁的发生。

3. synchronized在发生异常和同步块结束的时候,会自动释放锁。而Lock必须手动释放, 所以如果忘记了释放锁,一样会造成死锁。
 
 
 
JDK6 以后,新增加了一个包java.util.concurrent.atomic,里面有各种原子类,比如AtomicInteger。
而AtomicInteger提供了各种自增,自减等方法,这些方法都是原子性的。 换句话说,自增方法 incrementAndGet 是线程安全的,同一个时间,只有一个线程可以调用这个方法。
所以可以用
        AtomicInteger atomicI =new AtomicInteger();
        int i = atomicI.decrementAndGet();
        int j = atomicI.incrementAndGet();
        int k = atomicI.addAndGet(3);
来代替i++等,i++之所以会出现错误的数值,因为非原子性,由三个原子组成
步骤1. 取 i 的值
步骤 2. i + 1
步骤 3. 把新的值赋予i
 
posted @ 2018-04-03 17:56  lspa  阅读(210)  评论(0编辑  收藏  举报