Java 中的多线程具有静态和非静态方法

MultiTheading in Java having static and non static method

我一直在 java 中尝试多线程的不同行为。如果我在 class 中同时使用同步静态和非静态方法。 我的理解是,

-> 如果线程进入同步方法,线程将获取对象的锁,直到方法执行。

-> 如果线程进入静态同步方法,则线程获取 class 而不是对象的锁。

真正混淆的部分是输出??。

    package com.threadImplementaion.examples;

class MyRunable implements Runnable
{
    public void run()
    {
        iterationMethod() ;
        staticIteration();
    }
    public synchronized void iterationMethod() 
    {
        //int count = 0  ;
        for(int i = 0 ; i < 5; i++ )
        {
            System.out.println( Thread.currentThread().getName() + " : " +  i);
        }
    }
    public  static synchronized  void staticIteration()
    {
        for(int i = 0 ; i < 10 ; i++ )
        {
            System.out.println(Thread.currentThread().getName() +  " static "  +  i);
        }
    }
}
public class MyRunnable 
{
    public static void main(String[] args) {
        Runnable runnable = new MyRunable() ;
        Thread thread1 = new Thread(runnable);
        thread1.start();
        thread1.setName("Thread1");
        Thread thread2 = new Thread(runnable) ;
        thread2.start();
        thread2.setName("Thread2") ;
        Thread thread3 = new Thread(runnable); 
        thread3.start();
        thread3.setName("Thread3");
        }


}



Output :
Thread1 : 0
Thread1 : 1
Thread1 : 2
Thread1 : 3
Thread1 : 4
Thread1 static 0
Thread1 static 1
Thread1 static 2
Thread1 static 3
Thread1 static 4
Thread1 static 5
**Thread1 static 6**
Thread3 : 0
Thread3 : 1
Thread3 : 2
Thread3 : 3
Thread3 : 4
Thread2 : 0
Thread2 : 1
Thread1 static 7
Thread2 : 2
Thread1 static 8
Thread2 : 3
Thread1 static 9
Thread2 : 4
Thread2 static 0
Thread2 static 1
Thread2 static 2
Thread2 static 3
Thread2 static 4
Thread2 static 5
Thread2 static 6
Thread2 static 7
Thread2 static 8
Thread2 static 9
Thread3 static 0
Thread3 static 1
Thread3 static 2
Thread3 static 3
Thread3 static 4
Thread3 static 5
Thread3 static 6
Thread3 static 7
Thread3 static 8
Thread3 static 9

static 方法 lock/unlock class(MyRunable) 对象,其中作为非静态方法 lock/unock MyRunable 对象。这两者是不同的,我的意思是说。

A synchronized method (§8.4.3.6) automatically performs a lock action when it is invoked; its body is not executed until the lock action has successfully completed.

If the method is an instance method, it locks the monitor associated with the instance for which it was invoked (that is, the object that will be known as this during execution of the body of the method).

If the method is static, it locks the monitor associated with the Class object that represents the class in which the method is defined.

If execution of the method's body is ever completed, either normally or abruptly, an unlock action is automatically performed on that same monitor.

Link

同步的 static 方法获得 Class 对象 X 的锁,该对象表示定义该方法的 class。在这种情况下,synchronized 关键字原则上仅用于在 static 方法之间进行同步。

而同步实例(非static)方法锁定调用该方法的当前对象Y

因此,同步static方法和同步实例方法仍然可以交错,因为它们锁定在两个不同的对象上。