Java线程同步概念静态函数

时间:2014-05-12 15:12:56

标签: java multithreading synchronized

最近我的朋友在面试中被问到这个问题。

问题:我们有A类,有两种方法X1和X2。 X1是静态同步的,X2是同步的。

class A {
    public static synchronized X1() {
    }
    public synchronized X2() {
    }
}

现在我们知道静态同步在CLASS上获得了锁定并且同步获得了对调用对象的锁定。

采访者问及#34;锁定CLASS是什么意思?"。锁始终在Object上完成。那么在静态同步的情况下实际发生了什么。它在WHICH OBJECT上获得锁定?

有人可以为我清除这个概念,因为它在这里有点混乱。

2 个答案:

答案 0 :(得分:3)

根据Oracle concurrency tutorial

  

您可能想知道静态同步方法会发生什么   调用,因为静态方法与类关联,而不是   宾语。在这种情况下,线程获取内部锁   与类关联的类对象。因此可以访问类的静态   字段由锁定控制,该锁定与任何锁定不同   班级的实例。

答案 1 :(得分:-1)

正如此SO answer完全指出

there is no link between synchronized static methods and sync'ed non static methods in 
this context

证明这一点。

public class SimpleClassTest {

静态同步方法

public static synchronized void X1() {
        System.out.println("Before X1 Exec.. From"+Thread.currentThread().getName());
        try {
            Thread.currentThread().sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("After X1 Exec.. From"+Thread.currentThread().getName());
    }

非静态同步方法

public synchronized void X2() {
        System.out.println(" X2 Exec.. From"+Thread.currentThread().getName());
    }

第一种方法只是睡了一段时间然后醒来。 第二种方法是同步但不是静态的。

现在尝试创建两个线程并同时调用此方法(约)

public static void main(String args[]){
        final SimpleClassTest instance = new SimpleClassTest();

静态的第一个线程

    Thread t1 = new Thread(new Runnable() {

        @Override
        public void run() {
            SimpleClassTest.X1();
        }
    },"Thread1");

非静态的第二个线程

    Thread t2 = new Thread(new Runnable() {

        @Override
        public void run() {
            instance.X2();
        }
    },"Thread2");

现在启动两个线程

    t1.start();
    t2.start();

结果

Before X1 Exec.. FromThread1
 X2 Exec.. FromThread2
After X1 Exec.. FromThread1

从结果中两个线程都运行而没有相互锁定。因为如果第一个线程锁定第二个线程锁定的同一个对象,那么线程2将等到第一个线程完成。

因此,我们确信两者并行运行。

Firs线程已经锁定SimpleClasstest.class,因为它是静态方法,与实例无关。

第二个线程已锁定实例,因为它是非静态的。

希望它清除