内部锁:synchronized关键字
Java中的每个对象都有一个与之关联的内部锁(Intrinsic lock),这种锁也称为监视器(Monitor),这种内部锁是一种排它锁,可以保障原子性、可见性、有序性。
内部锁是通过synchronized关键字实现的
synchronized(对象锁) {
同步代码块
}
1、synchronized同步代码块
package com.gykalc.jdk8.threadorder;
/**
* synchronized同步代码块
*/
public class Test01 {
public static void main(String[] args) {
Test01 obj = new Test01();
new Thread(() -> {
obj.mm();
}).start();
new Thread(() -> {
obj.mm();
}).start();
}
// 定义方法,打印100行字符串
public void mm() {
synchronized (this) {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + "--->" + i);
}
}
}
}
2、使用常量作为锁对象
package com.gykalc.jdk8.threadorder;
/**
* synchronized同步代码块
*/
public class Test01 {
public static void main(String[] args) {
Test01 obj = new Test01();
new Thread(() -> {
obj.mm();
}).start();
new Thread(() -> {
obj.mm();
}).start();
}
private static final Object OBJ = new Object();
// 定义方法,打印100行字符串
public void mm() {
synchronized (OBJ) {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + "--->" + i);
}
}
}
}
3、synchronized同步实例方法
package com.gykalc.jdk8.threadorder;
/**
* synchronized同步实例方法
* 对象锁默认为this
*/
public class Test01 {
public static void main(String[] args) {
Test01 obj = new Test01();
Test01 obj2 = new Test01();
new Thread(() -> {
obj.mm();
}).start();
new Thread(() -> {
obj2.mm();
}).start();
}
// 定义方法,打印100行字符串
public synchronized void mm() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + "--->" + i);
}
}
}
4、synchronized同步实例方法
package com.gykalc.jdk8.threadorder;
/**
* synchronized同步实例方法
* 对象锁默认为当前类的运行时类对象,即 Test01.class对象
*/
public class Test01 {
public static void main(String[] args) {
Test01 obj = new Test01();
Test01 obj2 = new Test01();
new Thread(() -> {
obj.mm();
}).start();
new Thread(() -> {
obj2.mm();
}).start();
}
// 定义方法,打印100行字符串
public synchronized static void mm() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + "--->" + i);
}
}
}