Synchronized块同步方法中this和class对象

本文深入探讨了Java中synchronized关键字的两种用法:同步类方法和同步代码块,并通过实例对比了使用this与class对象作为锁的区别,展示了如何实现线程间的同步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

synchronized关键字有两种用法。第一种就是使用Synchronized关键字同步类方法。另外一种就是synchronized块

public  void add(String name){
		synchronized (this) {
		   name = "this->"+name;
		   System.out.println(Thread.currentThread()+"name:"+name);
		}
	}
	
	public synchronized  void delete(String name){
		name = "delete-->"+name;
		System.out.println(Thread.currentThread()+name);
	}

 syncronized块中this和class对象的主要应用区别

 

1.非静态方法可以使用this或者class对象来同步,而静态方法必须使用class对象来同步并且它们互不影响

2.this是针对当前引用的对象,class对象就是原始对象本身

public class Test{
	

	public static void main(String[] args){
		MyThread m = new MyThread("liming");
		MyThread m1 = new MyThread("yaotian");
		Thread t = new Thread(m);
		Thread t1 = new Thread(m1);
	    t.start();
	    t1.start();
	}
}
 
class MyThread implements Runnable{
   
    private String name;
    
    public MyThread(String name){
    	this.name=name;
    }
    
	public void run() {
		add(name);		
	}

	public  void add(String name){
		synchronized (MyThread.class) {
		   name = "this->"+name;
		   System.out.println(Thread.currentThread()+"name:"+name);
		   delete(name);
		}
	}
	
	public synchronized  void delete(String name){
		name = "delete-->"+name;
		System.out.println(Thread.currentThread()+name);
	}
}

 在synchronized同步块中使用了MyThread.class对象作为监视器,并且生成了m,m1对MyThread引用对象,创建了两个线程t,t1来分别访问m,m1,最后得到的结果是:(这个结果是符合预期的结果,线程执行的顺序是先执行add后执行delete)

Thread[Thread-0,5,main]name:this->liming
Thread[Thread-0,5,main]delete-->this->liming
Thread[Thread-1,5,main]name:this->yaotian
Thread[Thread-1,5,main]delete-->this->yaotian

-----------------------------------------------------------------
Thread[Thread-1,5,main]name:this->yaotian
Thread[Thread-1,5,main]delete-->this->yaotian

Thread[Thread-0,5,main]name:this->liming
Thread[Thread-0,5,main]delete-->this->liming

如果我们将add中的同步监视器改为this结果是方法不同步

Thread[Thread-0,5,main]name:this->liming
Thread[Thread-1,5,main]name:this->yaotian
Thread[Thread-0,5,main]delete-->this->liming
Thread[Thread-1,5,main]delete-->this->yaotian

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值