目录
类锁和对象锁的区别
类锁
对象锁
测试用例
1.m1()和m2()方法都加锁【都为非静态,都加锁互斥执行】
2.m1()加锁,m2()不加锁【都为非静态,互不影响】
3.m3()和m4()都加锁【都为静态,互斥】
4.m3()加锁,m4()不加锁【都为静态,互不影响】
5.m1()加锁,m4()加锁【静态和非静态互不影响】
总结
类锁和对象锁的区别
类锁
给非静态的方法加锁,锁的是实例对象
是通过
synchronized static
关键字来实现的,例如:public static synchronized void staticMethod() { ... }
。
对象锁
给静态方法加锁,锁的是类
是通过
synchronized
关键字来实现的,例如:public synchronized void instanceMethod() { ... }
。
本文对对象锁和类锁做测试,以及对他们的特性进行总结。
首先我们创建一个Peerson类,该类中有四个方法m1(),m2(),m3(),m4(),其中,m1和m2是非静态的,m3和m4是静态的
Person.java
public synchronized void m1() {
System.out.println("m1方法开始");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("m1方法结束");
}
public void m2() {
System.out.println("m2方法开始");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("m2方法结束");
}
public static synchronized void m3() {
System.out.println("m3方法开始");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("m3方法结束");
}
public static synchronized void m4() {
System.out.println("m4方法开始");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("m4方法结束");
}
接下来创建一个线程类
public class ThreadPlus extends Thread{
private Person m;
private int flag;
public ThreadPlus(Person x,int flag) {
m = x;
this.flag = flag;
}
public void run() {
if(flag == 1){
m.m1();
}else {
m.m2();
}
}
}
最后创建一个Test.java
Person x1 = new Person();
ThreadPlus t1 = new ThreadPlus(x1,1);
ThreadPlus t2 = new ThreadPlus(x1,2);
t1.start();
t2.start();
t1.join();
t2.join();
测试用例
1.m1()和m2()方法都加锁【都为非静态,都加锁互斥执行】
public synchronized void m1() {
.......
}
public synchronized void m2() {
.......
}
执行之后的结果:
我们可以发现是互斥执行的
2.m1()加锁,m2()不加锁【都为非静态,互不影响】
3.m3()和m4()都加锁【都为静态,互斥】
4.m3()加锁,m4()不加锁【都为静态,互不影响】
5.m1()加锁,m4()加锁【静态和非静态互不影响】
总结
- 静态锁和静态锁互斥
- 非静态锁和非静态锁互斥
- 加锁的和加锁的互斥
- 加锁的和不加锁的不互斥
- 静态锁和非静态锁不互斥