`

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

    博客分类:
  • JAVA
 
阅读更多

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

分享到:
评论

相关推荐

    java多线程编程之使用Synchronized块同步方法

    在Java中,`synchronized`有两种使用方式:同步方法和同步代码块。 1. 同步方法: 同步方法是指在方法声明前加上`synchronized`关键字,它会锁定该方法所在的对象。对于非静态方法,锁的是当前对象实例;对于静态...

    java中synchronized(同步代码块和同步方法)详解及区别

    本篇文章将详细介绍`synchronized`的两种形式:同步代码块和同步方法,并分析它们的区别。 1. **同步代码块 (Synchronized Block)** 同步代码块的语法结构如下: ```java synchronized (object) { // 需要同步...

    java中synchronized用法

    在 Java 中,synchronized 关键字可以作用于 instance 变量、object reference(对象引用)、static 函数和 class literals(类名称字面常量)身上。 Synchronized 关键字的作用是取得对象的锁,而不是把一段代码或...

    java的线程同步机制synchronized关键字的理解_.docx

    synchronized 方法的缺陷是:同一个对象的不同线程之间会形成互斥,而对这个对象所属的 Class 所产生的另一对象却可以任意调用这个被加了 synchronized 关键字的方法。 synchronized 块 除了方法前用 synchronized...

    synchronized用法大全实例

    本实例大全将全面解析`synchronized`的使用方式,包括同步方法、同步语句块、类锁和对象锁。 ### 1. 同步方法 同步方法是通过在方法声明前加上`synchronized`关键字实现的。这样,同一时间只有一个线程可以执行该...

    同步代码块(synchronized).zip

    在这个例子中,`increment()`和`decrement()`方法都用到了同步代码块,使得计数操作不会因线程并发而出现不正确的结果。 通过这两个示例,我们可以学习到同步代码块在实际编程中的应用,以及如何解决多线程环境下的...

    synchronized详解

    例如,如果在一个类中有两个不同的对象P1和P2,它们各自调用同一个同步方法,这两个线程会形成互斥,即在任何时刻只有一个线程能够执行同步方法。但是,类的其他实例P2可以不受限制地调用这个同步方法,因为每个对象...

    Java中synchronized关键字修饰方法同步的用法详解

    在内部类中,`synchronized`关键字同样可以用于同步方法或者同步块。不过,需要注意的是,内部类中的`this`指的是内部类自身,而不是外部类。如果需要同步外部类的方法,需要使用`OuterClass.this`。例如: ```...

    synchronized的几种示例

    本文将深入探讨`synchronized`的几种使用示例,包括方法加锁、代码块加锁(针对`this`和对象)以及静态方法加锁。 1. **方法加锁** 当在实例方法前使用`synchronized`关键字时,它会锁定当前对象的监视器,只有...

    java里面synchronized用法.doc

    在上面的例子中,synchronized 关键字被用于 myMethod 方法上,以防止多个线程同时访问同一个对象的 myMethod 方法。 2. 类范围:synchronized 关键字也可以被用于类范围内,以防止多个线程同时访问同一个类中的...

    Android synchronized 测试案例

    本测试案例深入探讨了`synchronized`的使用方法,包括同步单个对象、同步多个对象以及成功与失败的场景对比。 一、`synchronized`关键字的基本概念 `synchronized`关键字可以修饰方法或用作代码块,其主要作用是...

    java synchronized同步静态方法和同步非静态方法的异同

    内类中,`synchronized`块的`this`则代表内类实例,如果需要同步外类的非静态方法,可以使用`OuterClass.this`: ```java public class Test { class InnerClass { public void method3() { synchronized (Test....

    Java中的同步机制:深入理解synchronized关键字

    synchronized保证了被修饰的代码块或方法的三个特性:原子性、可见性和有序性。原子性确保代码块要么完整执行要么不执行,这避免了部分执行时的不一致问题。可见性保证了一个线程对共享变量的修改对其他线程是可见的...

    深入理解java中的synchronized关键字

    - 如果一个线程在一个对象的`synchronized(this)`块中,其他线程仍然可以访问该对象的非`synchronized(this)`代码块。 - 对象锁仅适用于该对象的`synchronized`代码块,不影响其他线程对其他对象的访问。 以下是...

    使用synchronized实现多线程同步.pdf

    例如,在文档中提到的第一个示例中,`run()`方法被`synchronized`修饰,但由于`t1`和`t2`是基于不同对象`r1`和`r2`的线程,它们实际上访问的是不同的数据,因此`synchronized`在这个例子中没有起到同步的作用。...

    java_synchronized详解

    - 如果一个线程正在访问对象的`synchronized(this)`同步代码块,其他线程仍然可以访问该对象的非`synchronized(this)`代码块。例如: ```java package ts; public class Thread2 { public void m4t1() { ...

    Synchronized关键字的用法

    通过`synchronized`关键字,开发者可以控制代码块或方法的并发访问,从而确保数据的一致性和程序的正确性。 #### 使用场景 1. **同步代码块**:可以通过`synchronized`关键字来声明同步代码块,即通过指定对象锁来...

    Java synchronized关键_动力节点Java学院整理

    在提供的示例中,`MyRunable`类的`run()`方法使用`synchronized(this)`代码块,这里的`this`指的是`MyRunable`对象。由于`t1`和`t2`都基于同一个`Runnable`对象`demo`创建,所以它们共享`demo`的锁。当一个线程执行`...

    Java多线程-同步机制解决线程安全问题方式一:同步代码块

    对于同步方法,静态方法的锁对象是类的`Class`对象,非静态方法的锁对象是`this`(当前实例)。 2. 同步操作的思考顺序 - 识别线程安全问题:首先确定哪部分代码是多线程运行的,然后判断是否存在共享数据,最后看...

    synchronized关键字的用法详解

    在这个示例中,`Thread1`类实现了`Runnable`接口,并在`run`方法中定义了一个`synchronized(this)`代码块。当两个线程`A`和`B`分别启动时,它们都将尝试执行该同步代码块。根据`synchronized`的特性,一次只有一个...

Global site tag (gtag.js) - Google Analytics