`
pi88dian88
  • 浏览: 40064 次
  • 性别: 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同步静态方法和同步非静态方法的异同

    主要介绍了java synchronized同步静态方法和同步非静态方法的异同的相关资料,需要的朋友可以参考下

    java 多线程设计模式 进程详解

    静态方法(有关同步的细节) 总结 第五章 Java线程编程的例子 数据结构和容器 简单的同步例子 一个网络服务器类 AsyncInputStream类 使用TCPServer和AsynclnputStream 总结 第六章 Java线程调度 线程调度概述 ...

    Linux系统编程之线程同步

    而,编程中、通信中所说的同步与生活中大家印象中的同步概念略有差异。“同”字应是指协同、协助、互相配合。主旨在协同步调,按预定的先后次序运行。 线程同步 同步即协同步调,按预定的先后次序运行。 线程同步...

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

    synchronized可以用来同步静态和非静态方法,下面就具体来看一下Java中synchronized关键字修饰方法同步的用法详解:

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

    synchronized块来同步一个对象变量,也可以使用synchronized块来同步类中的静态方法和非静态方法,下面使用Synchronized块同步方法

    电动汽车用永磁同步电机无传感器矢量控制系统的研究_赵雅楠

    NraTLaBisnv}m.n}的平台上对系统的动静态特性进行了仿真,仿真结果表明这 种方法可以很好实现对转子位置的检测。在最后本文还讨论了功率变换器件的非线 性尤其是死区时间,对转子位置估计的影响,并提出了相应的补偿...

    永磁同步电机混合非线性控制策略 (2010年)

    永磁同步电机是一个非线性多变量强耦合系统,采用传统的线性控制方法难以在大范围运行中保持良好的动态性能和鲁棒性。针对永磁同步电机的特点,提出一种结合滑模控制和自抗扰控制的混合非线性控制策略,用于永磁同步...

    大数据面试题.docx

    7、静态方法中能调用非静态方法吗?为什么? 8、java中final关键字有什么作用? 9、error与Exception区别? 10、hive中null数据如何存储? 11、Hive中row_number()、dense_ran、rank、ntile区别 12、什么叫朴素...

    Java多线程与并发-原理

    文章目录synchronized线程安全主要诱因互斥锁特性获取对象锁同对象,异步同对象,同步代码块同对象,非静态同步方法同对象,同步代码块 对比 非静态同步方法不同对象,同步代码块 对比 非静态同步方法获取类锁和对象...

    高速永磁同步电机滑模变结构一体化解耦控制

    为了改善高速永磁同步电动机的控制性能,从永磁同步电动机的非线性动态数学模型出发,应用精确线性化理论并结合滑模变结构控制方法,将转速环与电流环结合在一起设计了一体化控制器,解决了小惯量高速永磁电机电磁与...

    BASS软件GPS数据处理方法

    详细介绍了BASS(同步信号块处理)方法在静态软件GPS接收机数据处理方面的应用。首先说明了BASS的基本思 想,然后具体介绍了捕获时根据相位差求精频的方法,以及在跟踪时使用理想相关方法进行码跟踪,使用相位差方法...

    永磁同步电机矢量控制系统建模与仿真 (2011年)

    基于永磁同步电机具有多变量、非线性的复杂特性,为研究需要,对其物理模型进行简化,建立了电机的数学模型及其基本方程.在矢量控制众多方法中采用最为简单的使直轴电流id =0方法进行研究,得到了基于转子磁场定向矢量...

    基于多指标非线性控制的永磁同步电动机转速控制 (2014年)

    应用精确线性化方法研究了永磁同步电动机的非线性控制问题。根据精确线性化理论,设计了永磁同步电动机状态反馈线性化控制器和相对阶为1的多指标输入输出反馈线性化控制器。多指标非线性控制器选择全状态量线性组合...

    无速度传感器的表面式永磁同步电机无源控制策略

    针对高性能的表面式永磁同步电机(SPMSM)调速系统, 考虑电机实际运行过程中逆变器非线性因素对传动 系统的影响, 推导出考虑逆变器的SPMSM系统统一端口受控耗散哈密顿数学模型. 基于能量成形方法和端口受控 ...

    基于VFI的多核实时系统的同步感知能源管理

    电压和频率岛(VFI)最近被用作多核的有效能源管理技术处理器。... 静态方案获得的节能效果与不同不同VFI上任务的频率接近最佳整数非线性编程(INLP)解决方案的频率。 而且, 与单处理器系统的现有解决方

    word源码java-sync:同步

    在非静态方法里需要传入的对象 this 在静态方法里需要传入的对象 类名.class 一个对象的实例,指向其实例的变量应当被static修饰。 问题 java当中的锁 公平锁、非公平锁、读写锁、共享锁、互斥锁、自旋锁、偏向锁、...

    无刷同步电动机智能励磁系统研究

    针对同步电动机的非线性、参数时变及数学模型的复杂性,单纯的对励磁...仿真结果表明:与PID控制方法相比,在功率因数调节中获得了比较理想的动态和静态特性,优越性明显。该励磁系统已在武钢一热轧厂运行,效果良好。

    项目中用到的jdbc连接 单例模式

    在该方法中,Singleton有一个private类型静态内部类, * 内部类在外部类加载的时候并不会加载,只有在调用getInstance方法的时候加载SingletonHolder类。 * 分析: * 类载入到jvm的时候,会进行初始化,但是只会...

Global site tag (gtag.js) - Google Analytics