【多线程】Synchronize关键字之对象锁和类锁

目录

类锁和对象锁的区别

类锁

对象锁

测试用例

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() {
.......
}

执行之后的结果:

【多线程】Synchronize关键字之对象锁和类锁_第1张图片

 我们可以发现是互斥执行的

2.m1()加锁,m2()不加锁【都为非静态,互不影响】

【多线程】Synchronize关键字之对象锁和类锁_第2张图片

 3.m3()和m4()都加锁【都为静态,互斥】

【多线程】Synchronize关键字之对象锁和类锁_第3张图片

  4.m3()加锁,m4()不加锁【都为静态,互不影响】

【多线程】Synchronize关键字之对象锁和类锁_第4张图片

 5.m1()加锁,m4()加锁【静态和非静态互不影响】

【多线程】Synchronize关键字之对象锁和类锁_第5张图片

总结

  • 静态锁和静态锁互斥
  • 非静态锁和非静态锁互斥
  • 加锁的和加锁的互斥
  • 加锁的和不加锁的不互斥
  • 静态锁和非静态锁不互斥

你可能感兴趣的:(java)