1、通过对一个对象进行加锁来实现同步
2、对一个方法进行synchronized声明,进而对一个方法进行加锁来实现同步。
3、无论是对一个对象进行加锁还是对一个方法进行加锁,实际上,都是对对象进行加锁
也就是说,对于方式2,实际上虚拟机会根据synchronized修饰的是实例方法还是类方法,去取对应的实例对象或者Class对象来进行加锁。
4、刚才我们说,锁实际上是加在对象上的,那么被加了锁的对象我们称之为锁对象,在java中,任何一个对象都能成为锁对象。
java对象在内存中的存储结构主要有一下三个部分:
-
对象头
-
实例数据
-
填充数据
所谓临界区,就是只允许一个线程进去执行操作的区域,即同步代码块。CAS是一个原子性操作
偏向锁的概念
偏向锁是jdk1.6引入的一项锁优化,其中的“偏”是偏心的偏。它的意思就是说,这个锁会偏向于第一个获得它的线程,在接下来的执行过程中,假如该锁没有被其他线程所获取,没有其他线程来竞争该锁,那么持有偏向锁的线程将永远不需要进行同步操作。
轻量级锁也被称为非阻塞同步、乐观锁,因为这个过程并没有把线程阻塞挂起,而是让线程空循环等待,串行执行。
锁的分类:偏向锁,轻量级锁(自旋锁,自适应自旋锁),重量级锁
为什么说重量级锁开销大呢
主要是,当系统检查到锁是重量级锁之后,会把等待想要获得锁的线程进行阻塞,被阻塞的线程不会消耗cup。但是阻塞或者唤醒一个线程时,都需要操作系统来帮忙,这就需要从用户态转换到内核态,而转换状态是需要消耗很多时间的,有可能比用户执行代码的时间还要长。
互斥锁(重量级锁)也称为阻塞同步、悲观锁
未完待续,