- sleep和wait
- 都是让当前现场展示放弃cpu的使用权,进入阻塞状态
- 方法归属
- sleep 是Thread的静态方法
- wait,wait(long)都是Object的成员方法,每个对象都有
- 醒来时机
- sleep和wait(long)都会在相对应的时间后醒来
- wait(long)和wait()还可以被notify唤醒,wait()不唤醒就一直等下去
- sleep可以使用interrupt方法打断睡眠
- 锁特性
- sleep方法的调用必须先获取wait对象的锁,sleep无此限制
- wait方法执行后会释放对象锁,允许其他现场获得该对象锁
- sleep如果在synchronized代码块中执行,并不会释放对象锁
- lock和synchronized
- 语法
- synchronized是关键字,源码在jvm中,使用c++实现
- lock是接口,源码由jdk提供,使用java语言实现
- 使用synchronized时,退出同步代码块会自动释放,lock需要使用unlock方法释放锁
- 功能
- 俩者都是悲观锁,都具备基本的互斥、同步、锁重入功能
- lock提供了许多synchronized不具备的功能,例如获取等待状态、公平锁、可打断、可超时、多条件变量
- lock 有适合不同场景的实现,入reentrantLock,ReentrantReadWriteLock
- 性能
- 没有竞争时,synchronized做了很多优化,如偏向锁,轻量级锁,性能不赖
- 竞争籍烈时,lock的实现通常会提供更好的性能
- volatile能都保证线程安全
- 可见性:一个线程对共享变量修改,另一个线程能看到最新的结果
- 有序性:一个线程内代码按编写顺序执行
- 原子性:一个线程内多行代码以一个整体运行,期间不能有其他线程的代码插队
- volatile能把保证可见性和有序性,不能保证原子性
posted @
2022-07-15 14:39
hanukkah
阅读(
68)
评论()
编辑
收藏
举报