synchronized 修饰在 static方法和非static方法的区别

Posted 读书使人进步

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了synchronized 修饰在 static方法和非static方法的区别相关的知识,希望对你有一定的参考价值。

  Java中synchronized用在静态方法和非静态方法上面的区别

  在Java中,synchronized是用来表示同步的,我们可以synchronized来修饰一个方法。也可以synchronized来修饰方法里面的一个语句块。那么,在static方法和非static方法前面加synchronized到底有什么不同呢?大家都知道,static的方法属于类方法,它属于这个Class(注意:这里的Class不是指Class的某个具体对象),那么static获取到的锁,是属于类的锁。而非static方法获取到的锁,是属于当前对象的锁。所以,他们之间不会产生互斥。

  看代码:

public class Demo {
	public static synchronized void staticFunction()
			throws InterruptedException {
		for (int i = 0; i < 3; i++) {
			Thread.sleep(1000);
			System.out.println("Static function running...");
		}
	}

	public synchronized void function() throws InterruptedException {
		for (int i = 0; i <3; i++) {
			Thread.sleep(1000);
			System.out.println("function running...");
		}
	}

	public static void main(String[] args) {
		final Demo demo = new Demo();
		Thread thread1 = new Thread(new Runnable() {
			@Override
			public void run() {
				try {
					staticFunction();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		});

		Thread thread2 = new Thread(new Runnable() {
			@Override
			public void run() {
				try {
					demo.function();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		});

		thread1.start();
		thread2.start();
	}
}

  运行结果是:

function running...
Static function running...
function running...
Static function running...
function running...
Static function running...

  那当我们想让所有这个类下面的方法都同步的时候,也就是让所有这个类下面的静态方法和非静态方法共用同一把锁的时候,我们如何办呢?此时我们可以使用Lock。

以上是关于synchronized 修饰在 static方法和非static方法的区别的主要内容,如果未能解决你的问题,请参考以下文章

synchronized修饰方法static方法this.classobj的代码示例

Java中synchronized用在静态方法和非静态方法上面的区别

描述static, final, synchronized, volatile的作用

类的继承

synchronized相关梳理

java 类锁与对象锁(实例锁)同步问题