@ synchronized和lock的区别
1.首先synchronized是java内置关键字,在jvm层面,Lock是个java类;
2.synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁;
3.synchronized会自动释放锁(a 线程执行完同步代码会释放锁 ;b 线程执行过程中发生异常会释放锁),Lock需在finally中手工释放锁(unlock()方法释放锁),否则容易造成线程死锁;
4.synchronized的锁可重入、不可中断、非公平,而Lock锁可重入、可中断、可公平
5.Lock锁适合大量同步的代码的同步问题,synchronized锁适合代码少量的同步问题。
6.最重要的是Lock是一个接口,而synchronized是一个关键字,synchronized放弃锁只有两种情况:①线程执行完了同步代码块的内容②发生异常;而lock不同,任何条件下都可以主动放弃锁
public void addCount() {
synchronized (this) {
for (int i = 0; i < 100; i++) {
count++;
System.out.println(Thread.currentThread().getName() + "----" + count);
}
}
}
我们只能等待for循环执行完,其他线程才可以再次进入for循环
private Lock lock = new ReentrantLock();
public void addCount4() {
lock.lock();
for (int i = 0; i < 100; i++) {
count++;
if (i==50){
lock.unlock();
}
System.out.println(Thread.currentThread().getName() + "----" + count);
}
}
我们可以在for循环内部释放锁。也可以执行完for循环释放锁。