让星星⭐月亮告诉你,Java synchronized(*.class) synchronized 方法 synchronized(this)分析

简介: 本文通过Java代码示例,介绍了`synchronized`关键字在类和实例方法上的使用。总结了三种情况:1) 类级别的锁,多个实例对象在同一时刻只能有一个获取锁;2) 实例方法级别的锁,多个实例对象可以同时执行;3) 同一实例对象的多个线程,同一时刻只能有一个线程执行同步方法。

⭐⭐⭐结论🌙🌙🌙:

  1. synchronized(SynchronizedTest.class)锁加在类上,若有多个类的实例对象,则同一时刻只能由一个类的实例对象(拥有t1的线程th1)获取到该类上的锁,其他类的实例对象(拥有t2的线程th2)需要等待
  2. synchronized void synchronizedMethod() 锁加在普通方法上,同一时刻多个实例对象访问到该方法时,每个实例对象都可以进行方法的执行
  3. synchronized void synchronizedMethod() 锁加在当前实例对象上,多个线程拥有同一个实例对象,同一时刻只能有一个拥有该实例对象的线程获得该方法锁进而执行方法,其他拥有该实例对象的线程需要等待

⭐⭐⭐代码🌙🌙🌙:

package unittest.thread;
public class SynchronizedTest {
   
 //锁住class对象
// public static  void synchronizedStatic(){
   
    public void synchronizedStatic(){
   
     synchronized(SynchronizedTest.class){
   
         for(int i = 0 ; i < 10 ; i ++){
   
             System.out.println(Thread.currentThread().getName() + i + ":synchronizedStatic");
             try {
   Thread.sleep(100);} catch (InterruptedException e) {
    e.printStackTrace();}
         }
     }
 }
 //锁住方法,lock标记打在该实例上
 public synchronized void synchronizedMethod(){
   
     for(int i = 0 ; i < 10 ; i ++){
   
         System.out.println(Thread.currentThread().getName() + i + ":synchronizedMethod");
         try {
   Thread.sleep(100);} catch (InterruptedException e) {
    e.printStackTrace();}
     }
 }
 //不会有影响,正常调用
 public  void synchronizedMethod2WithNosynchronized(){
   System.out.println("synchronizedMethod2WithNosynchronized"); }
 //synchronizedMethod 已经锁住实例,再加锁不成功
 public void synchronizedMethod2(){
   
     synchronized( this ){
   
         for(int i = 0 ; i < 10 ; i ++){
   
             System.out.println(Thread.currentThread().getName() + i + ":synchronizedMethod2");
             try {
   Thread.sleep(100);} catch (InterruptedException e) {
    e.printStackTrace();}
         }
     }
 }
 //synchronizedMethod 已经锁住实例, 再加锁不成功
 public void synchronizedMethod3(){
   synchronized( this ){
     System.out.println("synchronizedMethod3"); } }
 public static void main(String[] args) throws InterruptedException {
   
    final SynchronizedTest t= new SynchronizedTest();
    final SynchronizedTest t1= new SynchronizedTest();
    final SynchronizedTest t2= new SynchronizedTest();
//synchronized(SynchronizedTest.class)锁加在类上,若有多个类的实例对象,则同一时刻只能由一个类的实例对象(拥有t1的线程th1)获取到该类上的锁,其他类的实例对象(拥有t2的线程th2)需要等待
//Thread th1 = new Thread( new Runnable(){ @Override   public void run() {  SynchronizedTest.synchronizedStatic(); } } ,"线程th1-");  th1.start();
//Thread th2 = new Thread( new Runnable(){ @Override   public void run() {  SynchronizedTest.synchronizedStatic(); } } ,"线程th2-");  th2.start();
//Thread th1 = new Thread( new Runnable(){ @Override   public void run() {  t1.synchronizedStatic(); } } ,"线程th1-");  th1.start();
//Thread th2 = new Thread( new Runnable(){ @Override   public void run() {  t2.synchronizedStatic(); } } ,"线程th2-");  th2.start();

//synchronized void synchronizedMethod() 锁加在普通方法上,同一时刻多个实例对象访问到该方法时,每个实例对象都可以进行方法的执行
//Thread th3 = new Thread( new Runnable(){ @Override public void run() {t1.synchronizedMethod();} } ,"线程th3-"); th3.start();
//Thread th4 = new Thread( new Runnable(){ @Override public void run() { t2.synchronizedMethod();} } ,"线程th4-");  th4.start();
//synchronized void synchronizedMethod() 锁加在普通方法上,多个线程拥有同一个实例对象,同一时刻只能有一个拥有该实例对象的线程获得该方法锁进而执行方法,其他拥有该实例对象的线程需要等待
//Thread th3 = new Thread( new Runnable(){ @Override public void run() {t.synchronizedMethod();} } ,"线程th3-"); th3.start();
//Thread th4 = new Thread( new Runnable(){ @Override public void run() { t.synchronizedMethod();} } ,"线程th4-");  th4.start();

  //synchronized void synchronizedMethod() 锁加在当前实例对象上,多个线程拥有同一个实例对象,同一时刻只能有一个拥有该实例对象的线程获得该方法锁进而执行方法,其他拥有该实例对象的线程需要等待
//Thread th5 = new Thread( new Runnable(){ @Override public void run() { t.synchronizedMethod2();} } ,"线程th5-");  th5.start();
//Thread th6 = new Thread( new Runnable(){ @Override public void run() { t.synchronizedMethod2();} } ,"线程th6-");  th6.start(); 
  /*
  t.synchronizedMethod2WithNosynchronized();
  t.synchronizedMethod3();
  */
 }
}

```

目录
相关文章
|
8天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
41 4
|
19天前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
39 17
|
12天前
|
Java 测试技术 Maven
Java一分钟之-PowerMock:静态方法与私有方法测试
通过本文的详细介绍,您可以使用PowerMock轻松地测试Java代码中的静态方法和私有方法。PowerMock通过扩展Mockito,提供了强大的功能,帮助开发者在复杂的测试场景中保持高效和准确的单元测试。希望本文对您的Java单元测试有所帮助。
18 2
|
14天前
|
Java 编译器 Maven
Java“class file contains wrong class”解决
当Java程序运行时出现“class file contains wrong class”错误,通常是因为类文件与预期的类名不匹配。解决方法包括:1. 确保类名和文件名一致;2. 清理并重新编译项目;3. 检查包声明是否正确。
|
14天前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
31 2
|
15天前
|
Java 关系型数据库 数据库
面向对象设计原则在Java中的实现与案例分析
【10月更文挑战第25天】本文通过Java语言的具体实现和案例分析,详细介绍了面向对象设计的五大核心原则:单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则帮助开发者构建更加灵活、可维护和可扩展的系统,不仅适用于Java,也适用于其他面向对象编程语言。
10 2
|
14天前
|
Java Spring
JAVA获取重定向地址URL的两种方法
【10月更文挑战第17天】本文介绍了两种在Java中获取HTTP响应头中的Location字段的方法:一种是使用HttpURLConnection,另一种是使用Spring的RestTemplate。通过设置连接超时和禁用自动重定向,确保请求按预期执行。此外,还提供了一个自定义的`NoRedirectSimpleClientHttpRequestFactory`类,用于禁用RestTemplate的自动重定向功能。
|
6天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
2天前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
15 9
|
5天前
|
存储 安全 Java
Java多线程编程的艺术:从基础到实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及其实现方式,旨在帮助开发者理解并掌握多线程编程的基本技能。文章首先概述了多线程的重要性和常见挑战,随后详细介绍了Java中创建和管理线程的两种主要方式:继承Thread类与实现Runnable接口。通过实例代码,本文展示了如何正确启动、运行及同步线程,以及如何处理线程间的通信与协作问题。最后,文章总结了多线程编程的最佳实践,为读者在实际项目中应用多线程技术提供了宝贵的参考。 ####