【多线程】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() {
.......
}

执行之后的结果:

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

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

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

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

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

总结

  • 静态锁和静态锁互斥
  • 非静态锁和非静态锁互斥
  • 加锁的和加锁的互斥
  • 加锁的和不加锁的不互斥
  • 静态锁和非静态锁不互斥
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值