目录
案例说明
验证三种同步方式的独立性:
- 静态synchronized -> 类对象
- synchronized -> 实例对象(this)
- synchronized块 -> 参数对象
一、主程序
package xyz.jangle.thread.test.n2_2.synchonized;
import java.util.concurrent.TimeUnit;
/**
*
* 同步方法,临界区同步的三种方式。
* 从运行结果中可以看出,三种方式互不干扰,也说明他们不是互斥的,是不同的加锁方式。
* @author jangle
* @email jangle@jangle.xyz
* @time 2021年1月28日 上午10:27:48
*
*/
public class M {
private static final Object lock = new Object();
public static void main(String[] args) {
// 创建3个线程执行3个不同的方法。
M m = new M();
new Thread(() -> {
m.test1();
}).start();
new Thread(() -> {
M.test2();
}).start();
new Thread(() -> {
m.test3();
}).start();
}
/**
* 关联实例对象,即this,作为锁对象
*
* @author jangle
* @time 2021年1月28日 上午10:34:36
*/
public synchronized void test1() {
for (int i = 0; i < 10; i++) {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("111111111111");
}
}
/**
* 关联类对象,即Class对象,作为锁对象
*
* @author jangle
* @time 2021年1月28日 上午10:36:49
*/
public static synchronized void test2() {
for (int i = 0; i < 10; i++) {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("2222222222222");
}
}
/**
* 关联参数对象,即new Object(),作为锁对象
*
* @author jangle
* @time 2021年1月28日 上午10:37:11
*/
public void test3() {
synchronized (lock) {
for (int i = 0; i < 10; i++) {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("33333333333");
}
}
}
}
二、执行结果
111111111111
33333333333
2222222222222
111111111111
33333333333
2222222222222
111111111111
2222222222222
33333333333
111111111111
2222222222222
33333333333
111111111111
33333333333
2222222222222
111111111111
33333333333
2222222222222
111111111111
2222222222222
33333333333
111111111111
33333333333
2222222222222
111111111111
33333333333
2222222222222
111111111111
33333333333
2222222222222
三、总结
从运行结果中可以看出,三种方式互不干扰,也说明他们不是互斥的,是不同的加锁方式。

本文详细探讨了Java中三种同步方法的实现(静态synchronized、实例synchronized和synchronized块),通过实例展示了它们在并发环境中的独立性和非互斥性。通过运行结果得出结论:这些锁方式互不影响,适用于不同场景。

被折叠的 条评论
为什么被折叠?



