synchronized方法和对象锁

问题描述 投票:0回答:2

从我阅读和理解,每个对象都有锁发生时,它正试图访问一个同步的方法。我的继承人代码(在2个不同的类文件):

public class test {

 public synchronized void inc1( String who ) {

         for( int i = 0 ; i < 1500 ; i++ )
             System.out.println( who+": "+i );
 }
}



public class testsyn implements Runnable {

    test k = new test( );

    public static void main( String[ ] args )
    {

        new Thread( new testsyn( ) ).start( );

        new testsyn( ).doStuff( );

    }

    public void doStuff( ) { k.inc1( "Main" ); }

    public void run( )
    {
        k.inc1( "Thread" );
    }
}

所以我们可以说,我的输出的第一行是:“主营:0”。这意味着,主线程已经收购了一个名为“K”,对测试对象的关键?比这怎么可能,我创建的其他线程能够获得主线程前的“INC1”方法和打印输出内完成呢?

我注意到,在这个特定的模式会出现此问题,但如果我会作出“K”静写了这个,而不是(在testsyn类):

public class testsyn implements Runnable {

    static test k = new test( );

    public static void main( String[ ] args )
    {

        new Thread( new testsyn( ) ).start( );

        k.inc1( "Main" );

    }


    public void run( )
    {
        k.inc1( "Thread" );
    }
}

这将有工作,我期待的方式,就不会有被输出之间的碰撞。对于〔实施例,如果主线程第一次进入synchronized方法,比其他线程必须等待,直到与该方法完成了主线程。

我问这里的问题是,这种变化是如何影响程序的行为?为什么?

java multithreading synchronization
2个回答
0
投票

是的,synchronized关键字用于获得锁;锁与对象实例相关联。你有test类的两个实例;一个给每个线程。因此,有没有争。当该字段k是静态的,则存在在线程之间共享的一个实例。


0
投票

所以我们可以说,我的输出的第一行是:“主营:0”。这意味着,主线程已经收购了一个名为“K”,对测试对象的关键?比这怎么可能,我创建的其他线程能够获得主线程前的“INC1”方法和打印输出内完成呢?

你写的好像有只有一个“命名为‘K’测试对象”。在你的榜样,k是类testsyn的实例变量,所以每个实例有它自己的。他们引用不同的对象,每个都有自己的监控。一个线程执行这些对象并不,因此,防止另一线程执行所述其他的同步实例方法中的一个的同步的实例方法。

如果我会作出“K”静态[...]就不会一直是输出之间的碰撞。

是。 static变量属于在声明它们的类。它们是由所有实例共享。静态k,已经main()运行之前被初始化,此后不被修改,由双方你的线程共享。由于它们都试图运行相同对象的同步方法,必须等到其他饰面。

© www.soinside.com 2019 - 2024. All rights reserved.