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

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

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