, 之前在面试的时候遇到了这个问题,没有理清楚相互之间的同步关系,现在有空记录下~
静态方法同步形式如: static synchronized method()
非静态方法同步形式如: synchronized method()
其中, 静态同步(static synchronized)锁定的对象是class,非静态方法同步锁定的对象是 当前对象(this)。
//方法1 public synchronized void method1() { } //方法2 public synchronized void method2() { }
上面的方法1与方法2锁定的对象都是 this,不能同时执行。
//方法3 public static synchronized void method3() { } //方法4 public static synchronized void method4() { } 也可以写成 public static void method4() { synchronized (Demo.class) { } }
上面的方法3与方法4锁定的对象都是当前类,不能同时执行。 但是方法1(或者2) 与 方法3(或者4) 能够同时执行。
public class SynchronizedTest { private static final String pattern = "HH:mm:ss"; public synchronized static void method1() { DateFormat format = new SimpleDateFormat(pattern); System.out.println("--method1 begin at: " + format.format(new Date())); sleep(3); System.out.println("--method1 end at: " + format.format(new Date())); } public synchronized static void method2() { DateFormat format = new SimpleDateFormat(pattern); System.out.println("--method2 begin at: " + format.format(new Date())); sleep(3); System.out.println("--method2 end at: " + format.format(new Date())); } public synchronized void method3() { DateFormat format = new SimpleDateFormat(pattern); System.out.println("--method3 begin at: " + format.format(new Date())); sleep(3); System.out.println("--method3 end at: " + format.format(new Date())); } public synchronized void method4() { DateFormat format = new SimpleDateFormat(pattern); System.out.println("--method4 begin at: " + format.format(new Date())); sleep(3); System.out.println("--method4 end at: " + format.format(new Date())); } private static void sleep(int secnonds) { try { Thread.sleep(secnonds * 1000); } catch (InterruptedException e) { e.printStackTrace(); } } public static void main(String[] args) { SynchronizedTest test = new SynchronizedTest(); new MyThread1().start(); new MyThread2().start(); new MyThread3(test).start(); new MyThread4(test).start(); } static class MyThread1 extends Thread { @Override public void run() { SynchronizedTest.method1(); } } static class MyThread2 extends Thread { @Override public void run() { SynchronizedTest.method2(); } } static class MyThread3 extends Thread { SynchronizedTest test; public MyThread3(SynchronizedTest test) { super(); this.test = test; } @Override public void run() { test.method3(); } } static class MyThread4 extends Thread { SynchronizedTest test; public MyThread4(SynchronizedTest test) { super(); this.test = test; } @Override public void run() { test.method4(); } } }
执行上面的代码,结果如下:
--method3 begin at: 17:02:58
--method1 begin at: 17:02:58
--method3 end at: 17:03:01
--method4 begin at: 17:03:01
--method1 end at: 17:03:01
--method2 begin at: 17:03:01
--method4 end at: 17:03:04
--method2 end at: 17:03:04
以上结果可以看到:
1,method1(静态 synchronized) 与method3(非静态 synchronized)可以同时执行。
2,method1(静态 synchronized) 与method2(静态 synchronized) 不能同时执行。 3,method3(非静态 synchronized) 与method4(非静态 synchronized) 不能同时执行。
相关推荐
本文将深入探讨`synchronized`关键字在同步静态方法和非静态方法上的异同。 首先,`synchronized`关键字有两种主要的使用方式:一是修饰方法,二是作为代码块。当`synchronized`修饰一个非静态方法时,锁住的是该...
非静态方法(实例方法)则包含一个隐含的参数,即对象实例的引用,这个引用在栈中存储。当调用非静态方法时,必须先创建对象实例,这样栈中才会有一个指向堆中对象实例的指针。这个指针使得实例方法能够访问并修改...
静态方法是与类关联,而不是与类的实例关联的方法。这意味着我们不需要创建类的实例就可以调用静态方法。它们在内存中只有一份,且在程序运行期间一直存在。静态方法通常用于那些不需要访问类实例状态的操作,例如...
基于synchronized修饰静态和非静态方法 synchronized关键字是Java语言中的一种同步机制,用于解决多线程并发问题。在Java中,synchronized可以修饰静态方法和非静态方法,两者的锁机制不同。 非静态方法 ...
在C#编程语言中,了解和掌握静态方法与非静态方法是至关重要的,因为它们各自有不同的特性和使用场景。静态方法和非静态方法是类中定义的两种主要方法类型。 1. 静态方法(Static Methods) - 定义:使用`static`...
非静态方法则可能涉及到对象的状态,因此在多线程环境下需要额外的同步措施来确保正确性。 总的来说,静态方法的继承和“重写”(实际上是子类中定义同名的静态方法)是Java编程中重要的概念。了解它们的工作原理...
静态方法不能访问非静态成员,因为非静态成员在没有实例的情况下不存在。它们通常用于工具方法或与类的状态无关的操作,如计算、比较等。 ```java public class MathUtils { public static int add(int a, int b) ...
通过上述分析和示例,我们可以看到,在Spring框架中,虽然不能直接使用`@Value`注解为静态变量注入值,但可以通过定义一个非静态方法并使用`@Value`注解来间接实现这一目标。这种方法不仅避免了潜在的警告和错误,还...
静态方法使用`static synchronized`修饰,锁住的是类的Class对象,而非静态方法锁住的是当前实例对象。这意味着,对于同一类的不同实例,静态同步方法之间是互斥的,而不同实例的非静态同步方法可以并发执行。 ```...
非静态方法的同步锁是当前对象`this`,确保同一时间只有一个线程能访问这个方法。 总结来说,Java中的同步代码块是一种有效的解决线程安全问题的手段,通过限制对共享资源的并发访问,可以保证数据的一致性和线程的...
3. 静态内部类可以有自己的静态成员和静态方法,这是非静态内部类所不允许的。 4. 在某些设计中,静态内部类常用于表示与外部类紧密相关的辅助类,如Java集合框架中的`LinkedList`类,它使用了一个静态内部类`Entry`...
在设计过程中,必须进行充分的仿真和测试,包括静态时序分析、动态仿真以及硬件原型验证,以确保同步电路满足设计规范和性能要求。 综上所述,《同步电路设计规则和方法》涵盖了同步电路设计的关键要素,对于理解并...
对于静态方法,锁的是整个类的对象。 4. **atomicaction(原子操作)**:Java并发包`java.util.concurrent.atomic`提供了一系列原子类,如`AtomicInteger`,用于在无需显式同步的情况下执行基本的读/改/写操作。 5...
synchronized可以用来同步静态和非静态方法,从而实现线程间的互斥访问。以下是关于synchronized修饰方法同步的详细解析: 1. 非静态方法的同步: 当一个非静态方法被synchronized修饰时,该方法被称为同步方法。...
静态文本框可以用来展示提示信息、标签或其他非交互式文本。CStatic支持几种不同的样式,包括纯文本、位图、图标等。 为了实现题目中描述的功能,你需要做以下步骤: 1. **创建窗口**:首先,你需要创建一个MFC...
而谐波则是因为非线性负荷的存在,使得电流或电压波形偏离正弦波,对电网造成污染,增加线路损耗,甚至导致设备故障。 D-STATCOM基于电压源逆变器(VSI)技术,通过实时监测电网状态并调整输出,快速补偿电网中的无...
在内部类(InnerClass)中,如果需要与外部类的非静态方法同步,可以使用`OuterClass.this`作为同步锁,例如: ```java public class SyncBlock { class InnerClass { public void innerMethod() { synchronized...
- **非静态类**:非静态成员在多线程环境中的访问可能需要同步控制,以防止数据竞争。 - **静态类**:静态成员在同一应用程序域内全局共享,访问时需要特别注意线程安全问题。 7. **MAUI和dotnet相关性** - 在...
4. **非final类的静态工厂方法可能导致意外的非唯一实例**:如果类非`final`,并且静态工厂方法没有采取适当的同步措施,可能会导致多个线程创建不同实例。 四、总结 静态工厂方法作为构造器的替代方案,提供了一...