互斥锁
我们知道volatile它不足以保证数据同步,那么就必须要引入锁来确保。互斥锁是最常见的同步手段,在并发过程中,当多条线程对同一个共享数据竞争时,它能保证共享数据同一时刻只能被一条线程使用,而其他线程只有等到锁释放后才能重新进行竞争。对于Java开发人员,我们最熟悉的肯定就是用synchronized关键词来完成锁功能。在涉及到多线程并发时,针对某些变量,你应该会毫不犹豫地加上synchronized去保证变量的同步性。
关于synchronized
在C/C++语言中,我们可以直接使用操作系统提供的互斥锁来实现同步。而Java语言则与之不同,Java需要把这些底层封装。Java提供的synchronized就是一个典型的互斥锁,同时它也是一个JVM级别的锁。它的实现细节全部封装在JVM中,对于开发人员只提供了synchronized关键词。根据锁的颗粒度,可以用synchronized对一个变量、一个方法、一个对象或一个类进行加锁。
锁范围
锁定范围要根据synchronized来确定。假如明确指定了锁对象,例如synchronized(变量)、synchronized(this)等,则说明加解锁对象为变量或运行时对象。假如没有明确指定对象,则根据synchronized修饰的方法去找对应的锁对象。如修饰一个非静态方法表示此方法