区别:
非静态方法是获取对象锁(如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关键字是Java语言中的一种同步机制,用于解决多线程并发问题。在Java中,synchronized可以修饰静态方法和非静态方法,两者的锁机制不同。 非静态方法 ...
本文将深入探讨`synchronized`关键字在同步静态方法和非静态方法上的异同。 首先,`synchronized`关键字有两种主要的使用方式:一是修饰方法,二是作为代码块。当`synchronized`修饰一个非静态方法时,锁住的是该...
当一个非静态方法被synchronized修饰时,锁住的是调用该方法的对象。每个对象都有自己的锁,因此不同的实例可以同时执行各自的同步方法,而不会相互干扰。这种同步方式适用于保护对象内部的状态,防止不同实例之间的...
Java 中的 synchronized 关键字是用来实现线程同步的,它可以用来修饰方法、代码块和静态方法,以确保在多线程环境下数据的一致性。 一、进程和线程的区别 在计算机中,每个运行着的 xxxx.exe 都是一个进程,而...
而如果希望同步非静态方法,可以使用`this`作为锁对象,这相当于同步整个方法体,与同步方法的效果相同: ```java public class SynchronizedTest3 { private synchronized void testNonStaticSynchronizedMethod...
当一个非静态方法被synchronized修饰时,该方法被称为同步方法。同步方法通过对象锁进行保护,同一时刻,只有一个线程能够访问该对象的同步方法。例如: ```java public class Test { public synchronized void ...
Java 语言中的修饰词可以用来控制成员的访问权限、确保类和方法的不可变性、定义抽象类和抽象方法、调用 native 库、确保浮点计算的精度和可移植性、确保多线程环境中的安全执行等等。正确地使用修饰词可以提高 Java...
- **对象锁**:如果`synchronized`修饰非静态方法或者同步语句块中的对象引用是实例引用,那么锁定的是该实例对象。例如: ```java public class MyObject { public synchronized void method() { // ... } }...
本文将深入探讨`synchronized`的几种使用示例,包括方法加锁、代码块加锁(针对`this`和对象)以及静态方法加锁。 1. **方法加锁** 当在实例方法前使用`synchronized`关键字时,它会锁定当前对象的监视器,只有...
`synchronized`还有一种高级用法——同步类方法(静态方法),这会锁定整个类,而非单个对象: ```java public class MyClass { public static synchronized void method() { // ... } } ``` 在这种情况下,所有...
2. **修饰静态方法**:如果`synchronized`修饰的是静态方法,那么它锁定的是当前类的Class对象,而不是实例对象。因此,所有线程在访问类的静态`synchronized`方法时都需要获取到类的锁,而非单个实例的锁。 3. **...
- 修饰静态方法:锁定的是类的Class对象。 - 修饰代码块:可以指定锁定的对象,通常用于同步类中的非静态成员变量。 3. **优势**: - 使用简单,无需额外的API依赖。 - 自动释放锁,当线程执行完同步代码块或...
当`synchronized`修饰非静态方法时,它会锁定当前对象实例。这意味着,对于同一个对象实例,如果有两个线程试图同时调用这个同步方法,只有一个线程能够获取到对象的锁并执行方法,其他线程则需要等待。但是,不同...
- **锁对象**:synchronized有两种使用方式:修饰实例方法(锁住当前实例对象)和修饰静态方法(锁住类的Class对象)。 - **监视器锁**:每个对象都有一个内置的监视器锁,synchronized就是基于这个锁来实现同步的...
3. 对象锁与类锁的区别:如果同步代码块是基于类的静态方法(`static synchronized`),则锁是针对类的,所有实例共享这个锁。而基于实例方法的同步锁是针对实例对象的。 4. 可重入性:一个线程已经拥有某个对象的...
对于非静态方法,同步锁是对象实例。 10. **volatile**: - `volatile`修饰的字段在多线程环境中能保证可见性和有序性,但不保证原子性。 - 当多个线程访问同一volatile字段时,无需使用synchronized,但仍需注意...
或者使用`synchronized`关键字修饰非静态方法,此时锁的对象是实例本身;对于静态方法,锁的对象是类的Class对象。同步方法的整个方法体被视为同步代码块,所有访问该方法的线程都需要获取到相应的锁才能执行。 在...
当`synchronized`关键字修饰一个非静态方法时,该方法的锁作用于`this`对象,即当前实例对象。这意味着,如果两个线程分别通过不同的实例对象调用同一个`synchronized`方法,它们可以并行执行,因为它们持有不同的...
2. 如果没有明确指定:若 Synchronized 修饰的方法为非静态方法,表示此方法对应的对象为锁对象;若 Synchronized 修饰的方法为静态方法,则表示此方法对应的类对象为锁对象。 问题三:什么是可重入性?为什么说 ...