synchronized(this)、synchronized(class)和synchronized(Object)的区别

简介: synchronized(this)、synchronized(class)和synchronized(Object)的区别

在多线程开发中,我们经常看到synchronized(this)、synchronized(*.class)与synchronized(任意对象)这几种类型同步方法。但是是否知道这几种写法有什么区别了?下面根据代码来分析:

1、synchronized代码块间的同步性

1686634696046.png

1686634713037.png1686634718055.png1686634735974.png

运行结果:

1686634757594.png

结论:

当一个线程访问ObjectService的一个synchronized (this)同步代码块时,其它线程对同一个ObjectService中其它的synchronized (this)同步代码块的访问将是堵塞,说明synchronized (this)使用的是同一个对象锁。



2、验证synchronized (this)代码块是锁定当前对象



package com.zwz.thread.demo2;  
public class ObjectService {  
public void objectMethodA(){  
System.out.println("run----objectMethodA");  
    }  
public void objectMethodB(){  
synchronized (this) {  
try {  
for (int i = 1; i <= 10; i++) {  
System.out.println("synchronized thread name:"+Thread.currentThread().getName()+"-->i="+i);  
Thread.sleep(1000);  
                }  
}catch (InterruptedException e) {  
                    e.printStackTrace();  
            }  
        }  
    }  
}



package com.zwz.thread.demo2;  
public class ThreadA extends Thread {  
private ObjectService objectService;  
public ThreadA(ObjectService objectService) {  
super();  
this.objectService = objectService;  
    }  
@Override  
public void run() {  
super.run();  
        objectService.objectMethodA();  
    }  
}



package com.zwz.thread.demo2;  
public class ThreadB extends Thread {  
private ObjectService objectService;  
public ThreadB(ObjectService objectService) {  
super();  
this.objectService = objectService;  
    }  
@Override  
public void run() {  
super.run();  
        objectService.objectMethodB();  
    }  
}



package com.zwz.thread.demo2;  
public class MainTest {  
public static void main(String[] args) throws InterruptedException {  
ObjectService service=new ObjectService();  
ThreadB b=new ThreadB(service);  
        b.start();  
Thread.sleep(2000);  
ThreadA a=new ThreadA(service);  
        a.start();  
    }  
}

运行结果:


相关文章
|
15天前
|
设计模式 JavaScript 前端开发
js中new和object.creat区别
【10月更文挑战第29天】`new` 关键字和 `Object.create()` 方法在创建对象的方式、原型链继承、属性初始化以及适用场景等方面都存在差异。在实际开发中,需要根据具体的需求和设计模式来选择合适的方法来创建对象。
|
3月前
|
前端开发 Java 编译器
【前端学java】java中的Object类和前端中的Object有什么区别(9)
【8月更文挑战第10天】java中的Object类和前端中的Object有什么区别
43 0
【前端学java】java中的Object类和前端中的Object有什么区别(9)
|
3月前
|
JavaScript 前端开发
Object.freeze() 和 const 的区别详解
【8月更文挑战第31天】
32 0
|
5月前
|
前端开发 JavaScript Java
Java基础10-深入理解Class类和Object类(二)
Java基础10-深入理解Class类和Object类(二)
48 5
|
5月前
|
Java C++
Java基础10-深入理解Class类和Object类(一)
Java基础10-深入理解Class类和Object类(一)
73 4
|
4月前
|
JSON JavaScript API
JS【详解】Map (含Map 和 Object 的区别,Map 的常用 API,Map与Object 的性能对比,Map 的应用场景和不适合的使用场景)
JS【详解】Map (含Map 和 Object 的区别,Map 的常用 API,Map与Object 的性能对比,Map 的应用场景和不适合的使用场景)
97 0
|
6月前
|
JavaScript 前端开发 索引
JavaScript与Object C的区别
JavaScript与Object C的区别
35 1
|
5月前
|
存储 JavaScript 前端开发
Object和Map的区别
Object和Map的区别
|
6月前
|
安全 Java 编译器
【JAVA】泛型和Object的区别
【JAVA】泛型和Object的区别
|
6月前
Object.prototype.toString.call() 和 instanceOf 和 Array.isArray() 区别以及优缺点
Object.prototype.toString.call() 和 instanceOf 和 Array.isArray() 区别以及优缺点
53 0