`

synchronized修饰静态方法和非静态方法的区别

    博客分类:
  • Java
 
阅读更多

 

区别:

    非静态方法是获取对象锁(如this)

    静态方法是获取类锁 (如:Demo.class)

 

public class StaticSynDemo {

private static String a="test";

//等同于方法print2
public synchronized void print1(String b){ //调用前要取得StaticSynDemo实例化后对象的锁
   System.out.println(b+a);
}
public void print2(String b){
   synchronized (this) {//取得StaticSynDemo实例化后对象的锁
    System.out.println(b+a);
   }
}
//等同于方法print4
public synchronized static void print3(String b){//调用前要取得StaticSynDemo.class类的锁
   System.out.println(b+a);
}
public static void print4(String b){
   synchronized (StaticSynDemo.class) { //取得StaticSynDemo.class类的锁
    System.out.println(b+a);
   }
}

}

分享到:
评论

相关推荐

    基于synchronized修饰静态和非静态方法

    基于synchronized修饰静态和非静态方法 synchronized关键字是Java语言中的一种同步机制,用于解决多线程并发问题。在Java中,synchronized可以修饰静态方法和非静态方法,两者的锁机制不同。 非静态方法 ...

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

    本文将深入探讨`synchronized`关键字在同步静态方法和非静态方法上的异同。 首先,`synchronized`关键字有两种主要的使用方式:一是修饰方法,二是作为代码块。当`synchronized`修饰一个非静态方法时,锁住的是该...

    静态方法同步 与 非静态方法同步

    当一个非静态方法被synchronized修饰时,锁住的是调用该方法的对象。每个对象都有自己的锁,因此不同的实例可以同时执行各自的同步方法,而不会相互干扰。这种同步方式适用于保护对象内部的状态,防止不同实例之间的...

    java synchronized 学习

    Java 中的 synchronized 关键字是用来实现线程同步的,它可以用来修饰方法、代码块和静态方法,以确保在多线程环境下数据的一致性。 一、进程和线程的区别 在计算机中,每个运行着的 xxxx.exe 都是一个进程,而...

    Java多线程程序中synchronized修饰方法的使用实例

    而如果希望同步非静态方法,可以使用`this`作为锁对象,这相当于同步整个方法体,与同步方法的效果相同: ```java public class SynchronizedTest3 { private synchronized void testNonStaticSynchronizedMethod...

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

    当一个非静态方法被synchronized修饰时,该方法被称为同步方法。同步方法通过对象锁进行保护,同一时刻,只有一个线程能够访问该对象的同步方法。例如: ```java public class Test { public synchronized void ...

    Java编程中常用修饰词使用方法

    Java 语言中的修饰词可以用来控制成员的访问权限、确保类和方法的不可变性、定义抽象类和抽象方法、调用 native 库、确保浮点计算的精度和可移植性、确保多线程环境中的安全执行等等。正确地使用修饰词可以提高 Java...

    synchronized用法大全实例

    - **对象锁**:如果`synchronized`修饰非静态方法或者同步语句块中的对象引用是实例引用,那么锁定的是该实例对象。例如: ```java public class MyObject { public synchronized void method() { // ... } }...

    synchronized的几种示例

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

    synchronized并发讲解源码.zip

    `synchronized`还有一种高级用法——同步类方法(静态方法),这会锁定整个类,而非单个对象: ```java public class MyClass { public static synchronized void method() { // ... } } ``` 在这种情况下,所有...

    Java并发编程系列- synchronized

    2. **修饰静态方法**:如果`synchronized`修饰的是静态方法,那么它锁定的是当前类的Class对象,而不是实例对象。因此,所有线程在访问类的静态`synchronized`方法时都需要获取到类的锁,而非单个实例的锁。 3. **...

    ReentrantLock与synchronized

    - 修饰静态方法:锁定的是类的Class对象。 - 修饰代码块:可以指定锁定的对象,通常用于同步类中的非静态成员变量。 3. **优势**: - 使用简单,无需额外的API依赖。 - 自动释放锁,当线程执行完同步代码块或...

    Java中使用synchronized关键字实现简单同步操作示例

    当`synchronized`修饰非静态方法时,它会锁定当前对象实例。这意味着,对于同一个对象实例,如果有两个线程试图同时调用这个同步方法,只有一个线程能够获取到对象的锁并执行方法,其他线程则需要等待。但是,不同...

    并发编程一之synchronized和volatile.rar

    - **锁对象**:synchronized有两种使用方式:修饰实例方法(锁住当前实例对象)和修饰静态方法(锁住类的Class对象)。 - **监视器锁**:每个对象都有一个内置的监视器锁,synchronized就是基于这个锁来实现同步的...

    java-synchronized详解.doc

    3. 对象锁与类锁的区别:如果同步代码块是基于类的静态方法(`static synchronized`),则锁是针对类的,所有实例共享这个锁。而基于实例方法的同步锁是针对实例对象的。 4. 可重入性:一个线程已经拥有某个对象的...

    java修饰词

    对于非静态方法,同步锁是对象实例。 10. **volatile**: - `volatile`修饰的字段在多线程环境中能保证可见性和有序性,但不保证原子性。 - 当多个线程访问同一volatile字段时,无需使用synchronized,但仍需注意...

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

    或者使用`synchronized`关键字修饰非静态方法,此时锁的对象是实例本身;对于静态方法,锁的对象是类的Class对象。同步方法的整个方法体被视为同步代码块,所有访问该方法的线程都需要获取到相应的锁才能执行。 在...

    举例讲解Java中synchronized关键字的用法

    当`synchronized`关键字修饰一个非静态方法时,该方法的锁作用于`this`对象,即当前实例对象。这意味着,如果两个线程分别通过不同的实例对象调用同一个`synchronized`方法,它们可以并行执行,因为它们持有不同的...

    并发面试专题.docx

    2. 如果没有明确指定:若 Synchronized 修饰的方法为非静态方法,表示此方法对应的对象为锁对象;若 Synchronized 修饰的方法为静态方法,则表示此方法对应的类对象为锁对象。 问题三:什么是可重入性?为什么说 ...

Global site tag (gtag.js) - Google Analytics