在多线程中,为了使线程安全,我们经常会使用synchronized和Lock进行代码同步和加锁,但是具体两者有什么区别,什么场景下适合用什么可能还不大清楚,主要的区别大致如下:
区别
1、synchronized是java关键字,而Lock是java中的一个接口
2、synchronized会自动释放锁,而Lock必须手动释放锁
3、synchronized是不可中断的,Lock可以中断也可以不中断
4、通过Lock可以知道线程有没有拿到锁,而synchronized不能
5、synchronized能锁住方法和代码块,而Lock只能锁住代码块
6、Lock可以使用读锁提高多线程读效率
7、synchronized是非公平锁,ReentranLock可以控制是否公平锁
从Lock接口中我们可以看到主要有5个方法,这些方法的功能从注释中可以看出:
lock():获取锁,如果锁被暂用则一直等待 unlock():释放锁 tryLock(): 注意返回类型是boolean,如果获取锁的时候锁被占用就返回false,否则返回true tryLock(long time, TimeUnit unit):比起tryLock()就是给了一个时间期限,保证等待参数时间 lockInterruptibly():用该锁的获得方式,如果线程在获取锁的阶段进入了等待,那么可以中断此线程,先去做别的事 通过 以上的解释,大致可以解释在上个部分中“锁类型(lockInterruptibly())”,“锁状态(tryLock())”等问题,还有就是前面子所获取的过程我所写的“大致就是可以尝试获得锁,线程可以不会一直等待”用了“可以”的原因。
public class LockTest { private Lock lock = new ReentrantLock(); private void method(Thread thread) { lock.lock(); try { System.out.println(thread.getName() + " has gotten the lock!"); } catch (Exception e) { e.printStackTrace(); } finally { System.out.println(thread.getName() + " has unlocked the lock!"); lock.unlock(); } } public static void main(String[] args) { final LockTest test = new LockTest(); Thread t1 = new Thread(new Runnable() { @Override public void run() { test.method(Thread.currentThread()); } }, "t1"); Thread t2 = new Thread(new Runnable() { @Override public void run() { test.method(Thread.currentThread()); } }, "t2"); t1.start(); t2.start(); } }
运行结果:
t1 has gotten the lock! t1 has unlocked the lock! t2 has gotten the lock! t2 has unlocked the lock!
public class LockTest { private Lock lock = new ReentrantLock(); private void method(Thread thread) { if (lock.tryLock()) { lock.lock(); try { System.out.println(thread.getName() + " has gotten the lock!"); } catch (Exception e) { e.printStackTrace(); } finally { System.out.println(thread.getName() + " has unlocked the lock!"); lock.unlock(); } } else { System.out.println("I'm "+thread.getName()+". Someone has gotten the lock!"); } } public static void main(String[] args) { LockTest test = new LockTest(); Thread t1 = new Thread(() -> test.method(Thread.currentThread()), "t1"); Thread t2 = new Thread(new Runnable() { @Override public void run() { test.method(Thread.currentThread()); } }, "t2"); t1.start(); t2.start(); } }
运行结果:
t1 has gotten the lock! t1 has unlocked the lock! I'm t2. Someone has gotten the lock!
看到这里相信大家也都会使用如何使用Lock了吧,关于tryLock(long time, TimeUnit unit)和lockInterruptibly()不再赘述。前者主要存在一个等待时间,在测试代码中写入一个等待时间,后者主要是等待中断,会抛出一个中断异常,常用度不高,喜欢探究可以自己深入研究。
以上就是Java 多线程Synchronized和Lock的区别的详细内容,更多关于Java 多线程Synchronized和Lock的资料请关注小牛知识库其它相关文章!
本文向大家介绍浅谈Synchronized和Lock的区别,包括了浅谈Synchronized和Lock的区别的使用技巧和注意事项,需要的朋友参考一下 如下所示: Synchronized是内置的java关键字,Lock是一个java类。 Synchronized无法判断是否获取到了锁,Lock可以判断是否获取到了锁。 Synchronized会自动释放锁,Lock必须手动释放锁。 Synchro
本文向大家介绍synchronized 和 Lock 有什么区别?相关面试题,主要包含被问及synchronized 和 Lock 有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 synchronized 可以给类、方法、代码块加锁;而 lock 只能给代码块加锁。 synchronized 不需要手动获取锁和释放锁,使用简单,发生异常会自动释放锁,不会造成死锁;而 lock 需要自己加锁
本文向大家介绍简单了解synchronized和lock的区别,包括了简单了解synchronized和lock的区别的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了简单了解synchronized和lock的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 类别 synchronized Lock 存在层次 Java的关键字 一个
本文向大家介绍详谈Lock与synchronized 的区别,包括了详谈Lock与synchronized 的区别的使用技巧和注意事项,需要的朋友参考一下 1、lock是可中断锁,而synchronized 不是可中断锁 线程A和B都要获取对象O的锁定,假设A获取了对象O锁,B将等待A释放对O的锁定, 如果使用 synchronized ,如果A不释放,B将一直等下去,不能被中断 如果 使用Ree
本文向大家介绍通过实例解析synchronized和lock区别,包括了通过实例解析synchronized和lock区别的使用技巧和注意事项,需要的朋友参考一下 1,原始构成 synchronized是关键字,属于JVM层面,通过wait,notify和notifyAll来调度线程。 Lock是具体类,是api层面的锁。 2,使用方法 synchronized不需要用户手动去释放锁, 当sync
本文向大家介绍Java多线程基础——Lock类,包括了Java多线程基础——Lock类的使用技巧和注意事项,需要的朋友参考一下 之前已经说道,JVM提供了synchronized关键字来实现对变量的同步访问以及用wait和notify来实现线程间通信。在jdk1.5以后,JAVA提供了Lock类来实现和synchronized一样的功能,并且还提供了Condition来显示线程间通信。 Lock类