lock和synchronized的区别
- lock是一个接口,synchronized是一个关键字
- synchronized是一个自动加锁释放锁的过程,无需用户操作,但是lock需要用户进行加锁和释放
- synchronized遇到异常时会自动释放锁,lock不会,所以lock需要配合try catch使用
- lock可以相应线程中断,synchronized不行
- 竞争激烈时lock效率更高
wait,notify和notifyAll要与synchronized一起用?
Object.wait(),Object.notify(),Object.notifyAll()都是Object的方法,换句话说,就是每个类里面都有这些方法。
Object.wait():释放当前对象锁,并进入阻塞队列
Object.notify():唤醒当前对象阻塞队列里的任一线程(并不保证唤醒哪一个)
Object.notifyAll():唤醒当前对象阻塞队列里的所有线程
为什么这三个方法要与synchronized一起使用呢?解释这个问题之前,我们先要了解几个知识点
每一个对象都有一个与之对应的监视器
每一个监视器里面都有一个该对象的锁和一个等待队列和一个同步队列
————————————————
原文链接:https://blog.csdn.net/qq_39907763/article/details/79301813
Condition
Condition是在java 1.5中才出现的,它用来替代传统的Object的wait()、notify()实现线程间的协作,相比使用Object的wait()、notify(),使用Condition的await()、signal()这种方式实现线程间协作更加安全和高效。因此通常来说比较推荐使用Condition,阻塞队列实际上是使用了Condition来模拟线程间协作。
Condition是个接口,基本的方法就是await()和signal()方法;
Condition依赖于Lock接口,生成一个Condition的基本代码是lock.newCondition()
调用Condition的await()和signal()方法,都必须在lock保护之内,就是说必须在lock.lock()和lock.unlock之间才可以使用
Conditon中的await()对应Object的wait();
Condition中的signal()对应Object的notify();
Condition中的signalAll()对应Object的notifyAll()。
使用方法
final Lock lock = new ReentrantLock();
final Condition condition = lock.newCondition();
lock.lock
condition.await();
lock.unlock
集合线程不安全
ArrayList 线程不安全 替换为 CopyOnWriteArrayList
Set 线程不安全 替换为 CopyOnWriteArraySet
HashMap线程不安全 替换为 ConcurrentHashMap