根据我的阅读和理解,每个对象都有在尝试访问同步方法时发生的锁定。这是我的代码(在 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" );
}
}
所以假设我的输出的第一行是:“Main:0”。这意味着主线程已经获取了名为“k”的测试对象的密钥,对吧?我创建的另一个线程怎么可能在主线程完成之前进入“inc1”方法并打印输出?
我注意到这个问题发生在这个特定的模式中,但是如果我将'k'设为静态并改为写这个(在testyn类中):
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" );
}
}
这将按我预期的方式工作,并且输出之间不会发生冲突。例如,如果主线程首先进入同步方法,那么其他线程将不得不等到主线程完成该方法。
我在这里要问的问题是这种变化如何影响程序的行为?为什么?
江户川乱折腾
慕的地10843
相关分类