让星星⭐月亮告诉你,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();
  */
 }
}

```

目录
相关文章
|
1天前
|
Java
让星星⭐月亮告诉你,自定义定时器和Java自带原生定时器
定时器是一种可以设置多个具有不同执行时间和间隔的任务的工具。本文介绍了定时器的基本概念、如何自定义实现一个定时器,以及Java原生定时器的使用方法,包括定义定时任务接口、实现任务、定义任务处理线程和使用Java的`Timer`与`TimerTask`类来管理和执行定时任务。
8 3
|
18小时前
|
Java 编译器
Java“返回类型为 void 的方法不能返回一个值”解决
在 Java 中,如果一个方法的返回类型被声明为 void,那么该方法不应该包含返回值的语句。如果尝试从这样的方法中返回一个值,编译器将报错。解决办法是移除返回值语句或更改方法的返回类型。
|
1天前
|
机器学习/深度学习 算法 搜索推荐
让星星⭐月亮告诉你,Java冒泡排序及其时间复杂度计算
冒泡排序是一种简单的排序算法,通过多次遍历数组,每次比较相邻元素并交换位置,将较小的元素逐步移至数组前端。第一轮结束后,最小值会位于首位;第二轮则将次小值置于第二位,依此类推。经过 (n-1) 轮遍历后,数组完成排序。冒泡排序的时间复杂度为 O(n²),在最优情况下(已排序数组)时间复杂度为 O(n)。示例代码展示了如何实现冒泡排序。
7 1
|
1天前
|
Java
让星星⭐月亮告诉你,jdk1.8 Java函数式编程示例:Lambda函数/方法引用/4种内建函数式接口(功能性-/消费型/供给型/断言型)
本示例展示了Java中函数式接口的使用,包括自定义和内置的函数式接口。通过方法引用,实现对字符串操作如转换大写、数值转换等,并演示了Function、Consumer、Supplier及Predicate四种主要内置函数式接口的应用。
7 1
|
1天前
|
Java 调度 UED
深入理解Java中的多线程与并发机制
本文将详细探讨Java中多线程的概念、实现方式及并发机制,包括线程的生命周期、同步与锁机制以及高级并发工具。通过实例代码演示,帮助读者理解如何在Java中有效地处理多线程和并发问题,提高程序的性能和响应能力。
|
6天前
|
监控 Java Linux
Java 性能调优:调整 GC 线程以获得最佳结果
Java 性能调优:调整 GC 线程以获得最佳结果
38 11
|
20小时前
|
Java
|
1天前
|
Java
【编程进阶知识】揭秘Java多线程:并发与顺序编程的奥秘
本文介绍了Java多线程编程的基础,通过对比顺序执行和并发执行的方式,展示了如何使用`run`方法和`start`方法来控制线程的执行模式。文章通过具体示例详细解析了两者的异同及应用场景,帮助读者更好地理解和运用多线程技术。
6 1
|
3天前
|
并行计算 Java 调度
深入理解Java中的多线程编程
【10月更文挑战第6天】 本文将探讨Java中多线程编程的基本概念、实现方式及其在实际项目中的应用。通过详细的示例和解释,读者能够掌握如何在Java中有效地使用多线程来提高程序的性能和响应能力。
8 1
|
4天前
|
Java 开发者
在 Java 多线程编程中,Lock 接口正逐渐取代传统的 `synchronized` 关键字,成为高手们的首选
【10月更文挑战第6天】在 Java 多线程编程中,Lock 接口正逐渐取代传统的 `synchronized` 关键字,成为高手们的首选。相比 `synchronized`,Lock 提供了更灵活强大的线程同步机制,包括可中断等待、超时等待、重入锁及读写锁等高级特性,极大提升了多线程应用的性能和可靠性。通过示例对比,可以看出 Lock 接口通过 `lock()` 和 `unlock()` 明确管理锁的获取和释放,避免死锁风险,并支持公平锁选择和条件变量,使其在高并发场景下更具优势。掌握 Lock 接口将助力开发者构建更高效、可靠的多线程应用。
12 2