很多同学分不清synchronized同步锁的一个机制,今天我们就详细来讲一下关于同步锁的机制。
还是老规矩开讲之前,先来了解几个基础概念。
J-1.1同步临界区
同步是JVM的一个特性,旨在保证两个或多个并发的线程不会同时执行同一块代码,这块代码我们称为同步临界区。临界区中的代码只能以串行的方式运行(一次只有一个线程执行)。通常在代码中我们使用synchronized代码块来包裹。
J-1.2锁
临界区的同步是通过监听器来实现的,监听器针对临界区的并发执行进行控制。每一个Java对象都和一个监听器相关联,线程通过获取和释放监听器的锁(一个标志)来上锁和解锁。
临界区的代码同一时间只能有一个线程执行,而获得执行权的这个线程我们称之为获得了锁,由于线程之间在临界区是互斥的,所以我也称之为互斥锁。其实,除了互斥锁还有共享锁的概念,共享锁是所有线程共享的一把锁,一般是用在读取数据的时候。
J-1.3缓存变量
我们的程序在未开始运行的时候是存在硬盘上的,当我们的程序开始运行,这时候程序会被load进内存。当我们程序中用到某个变量的时候,JVM和OS共同协调将内存中的变量缓存到寄存器或者处理器缓存中,此时寄存器或者处理器缓存中的变量就称为缓存变量。
J-1.4线程可见性
多个线程共同访问一个共享变量时,会拷贝一份缓存变量到自己的工作空间,线程内的变量对于其他线程是不可见的,这就是线程可见性。可以通过volatile来保证线程的可见性,同时synchronized也可以保证线程的可见性(当进入临界区,线程会从主存中读取变量,离开时把变量写回主存)。
1、synchronized代码块,我们先来 看下s