在Java多线程中,咱们要实现同步串行最先接触的就是synchronized关键字。多线程
基本语法以下:this
synchronized(锁) { // 代码块 }
sychronized关键字的锁主要有三种使用:spa
1)对象锁线程
2)类锁code
3)字符串锁对象
最多见的写法,synchronized写在了成员方法上,这表示它以this为锁,锁的是当前对象blog
public synchronized void execute() { // 代码 }
或者你也能够换一种写法,下降锁粒度内存
public void execute() { synchronized (this) { // 代码块 } }
静态方法加锁,那么锁的是类字符串
public static synchronized void execute() { // 代码块 }
你也能够把类看成锁同步
public void execute() { synchronized (SynchronizedDemo.class) { // 代码块 } }
除了对象锁,类锁,Java还支持以一个字符串做为锁。
这里注意,一般咱们会和String的intern()方法一块儿用。intern()方法会将相同的值引用指向常量池的同一个内存块,因此能够保证字符串值相同即锁相同(即便值是由引用拼接的)。
private String id = "1"; public void execute() { synchronized (id) { // 代码块 } }