文章目录
什么是synchronized?
synchronized
关键字可以实现一个简单的策略来防止线程干扰和内存一致性错误,如果一个对象是对多个线程可见的,那么对该对象的所有读写都将通过同步的方式来进行。
synchronized包括哪些jvm重要的指令?
monitor enter和monitor exit
synchronized关键字用法?
可以用于对代码块或方法的修饰
synchronized锁的是什么?
普通同步方法一>锁的是 当前实例对象。
静态同步方法一一>锁的 是当前类的Class对象。
同步方法快一>锁的 是synchonized括号里配置的对象。
volatile关键字
volatile
是轻量级
的synchronized,
它在多处理器开发中保证了共享变量的“可见性”。- Java语言规范第3版对volatile定义如下,Java允 许线程访问共享变量,为了保证共享变量能准确和- -致的更新,线程应该确保排它锁单独获得这个变量。如果-一个字段被声明为volatile,Java线程内存模型所有线程看到这个变量的值是一致的。
wait
- 方法wait()的作用是使当前执行代码的线程进行等待,wait()是Object类 通用的方法,该方法用来将当前线程置入“预执行队列"中,并在wait()所在的代码处停止执行,直到接到通知或中断为止。
- 在调用wait之前线程需要获得该对象的对象级别的锁。代码体现上,即只能是同步方法或同步代码块内。调用wait()后当前线程释放锁。
notify
- notify()也是Object类的通用方法,也要在同步方法或同步代码块内调用,该方法用来通知哪些可能等待该对象的对象锁的其他线程。
- 如果有多个线程等待,则随机挑选出其中-个呈wait状态的线程,对其发出通知notify,并让它等待获取该对象的对象锁。
notify/notifyAll
- notify等于说将等待队列中的一个线程移动到同步队列中,
- 而notifyAll是将等待队列中的所有线程全部移动到同步队列中。.
Lock接口
锁可以防止多个线程同时共享资源。Java5前程序是靠synchronized
实现锁功能。Java5之后, 并发包新增Lock
接口来实现锁功能。
Synchronized和lock
synchronized
是Java的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。JDK1. 5以后引入了自旋锁、锁粗化、轻量级锁,偏向锁来有优化关键字的性能。Lock
是一个接口, 而synchronized是Java中的关键字,synchronized是内置的语言实现;- synchronized在 发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过
unlock()
去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally
块中释放锁; Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断;通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。