`
pi88dian88
  • 浏览: 40691 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

    博客分类:
  • Java
阅读更多

  {#emotions_dlg.frown}, 之前在面试的时候遇到了这个问题,没有理清楚相互之间的同步关系,现在有空记录下~

 

  静态方法同步形式如:  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) 不能同时执行。

 

 

2
0
分享到:
评论

相关推荐

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

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

    从JVM内存管理的角度谈谈静态方法和静态属性

    非静态方法(实例方法)则包含一个隐含的参数,即对象实例的引用,这个引用在栈中存储。当调用非静态方法时,必须先创建对象实例,这样栈中才会有一个指向堆中对象实例的指针。这个指针使得实例方法能够访问并修改...

    生成静态的方法

    静态方法是与类关联,而不是与类的实例关联的方法。这意味着我们不需要创建类的实例就可以调用静态方法。它们在内存中只有一份,且在程序运行期间一直存在。静态方法通常用于那些不需要访问类实例状态的操作,例如...

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

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

    C#静态方法与非静态方法实例分析

    在C#编程语言中,了解和掌握静态方法与非静态方法是至关重要的,因为它们各自有不同的特性和使用场景。静态方法和非静态方法是类中定义的两种主要方法类型。 1. 静态方法(Static Methods) - 定义:使用`static`...

    静态(static)方法的继承和重写

    非静态方法则可能涉及到对象的状态,因此在多线程环境下需要额外的同步措施来确保正确性。 总的来说,静态方法的继承和“重写”(实际上是子类中定义同名的静态方法)是Java编程中重要的概念。了解它们的工作原理...

    什么是静态(static)什么是静态方法,静态变量,静态块

    静态方法不能访问非静态成员,因为非静态成员在没有实例的情况下不存在。它们通常用于工具方法或与类的状态无关的操作,如计算、比较等。 ```java public class MathUtils { public static int add(int a, int b) ...

    static静态变量使用@Value注入方式.md

    通过上述分析和示例,我们可以看到,在Spring框架中,虽然不能直接使用`@Value`注解为静态变量注入值,但可以通过定义一个非静态方法并使用`@Value`注解来间接实现这一目标。这种方法不仅避免了潜在的警告和错误,还...

    线程同步面试题深入解析

    静态方法使用`static synchronized`修饰,锁住的是类的Class对象,而非静态方法锁住的是当前实例对象。这意味着,对于同一类的不同实例,静态同步方法之间是互斥的,而不同实例的非静态同步方法可以并发执行。 ```...

    Java多线程-同步机制解决线程安全问题方式一:同步代码块

    非静态方法的同步锁是当前对象`this`,确保同一时间只有一个线程能访问这个方法。 总结来说,Java中的同步代码块是一种有效的解决线程安全问题的手段,通过限制对共享资源的并发访问,可以保证数据的一致性和线程的...

    Java编程中静态内部类与同步类的写法示例

    3. 静态内部类可以有自己的静态成员和静态方法,这是非静态内部类所不允许的。 4. 在某些设计中,静态内部类常用于表示与外部类紧密相关的辅助类,如Java集合框架中的`LinkedList`类,它使用了一个静态内部类`Entry`...

    同步电路设计规则和方法.pdf.rar

    在设计过程中,必须进行充分的仿真和测试,包括静态时序分析、动态仿真以及硬件原型验证,以确保同步电路满足设计规范和性能要求。 综上所述,《同步电路设计规则和方法》涵盖了同步电路设计的关键要素,对于理解并...

    java中线程同步方法

    对于静态方法,锁的是整个类的对象。 4. **atomicaction(原子操作)**:Java并发包`java.util.concurrent.atomic`提供了一系列原子类,如`AtomicInteger`,用于在无需显式同步的情况下执行基本的读/改/写操作。 5...

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

    synchronized可以用来同步静态和非静态方法,从而实现线程间的互斥访问。以下是关于synchronized修饰方法同步的详细解析: 1. 非静态方法的同步: 当一个非静态方法被synchronized修饰时,该方法被称为同步方法。...

    C++ 图形界面 实现文本编辑框输入同步显示到静态文本框

    静态文本框可以用来展示提示信息、标签或其他非交互式文本。CStatic支持几种不同的样式,包括纯文本、位图、图标等。 为了实现题目中描述的功能,你需要做以下步骤: 1. **创建窗口**:首先,你需要创建一个MFC...

    静态同步补偿器.pdf

    而谐波则是因为非线性负荷的存在,使得电流或电压波形偏离正弦波,对电网造成污染,增加线路损耗,甚至导致设备故障。 D-STATCOM基于电压源逆变器(VSI)技术,通过实时监测电网状态并调整输出,快速补偿电网中的无...

    java多线程编程之使用Synchronized块同步方法

    在内部类(InnerClass)中,如果需要与外部类的非静态方法同步,可以使用`OuterClass.this`作为同步锁,例如: ```java public class SyncBlock { class InnerClass { public void innerMethod() { synchronized...

    MSIL 静态类在 IL 定义上和非静态类的差别.rar

    - **非静态类**:非静态成员在多线程环境中的访问可能需要同步控制,以防止数据竞争。 - **静态类**:静态成员在同一应用程序域内全局共享,访问时需要特别注意线程安全问题。 7. **MAUI和dotnet相关性** - 在...

    java静态工厂方法详细解析——使用静态工厂方法代替构造器

    4. **非final类的静态工厂方法可能导致意外的非唯一实例**:如果类非`final`,并且静态工厂方法没有采取适当的同步措施,可能会导致多个线程创建不同实例。 四、总结 静态工厂方法作为构造器的替代方案,提供了一...

Global site tag (gtag.js) - Google Analytics