【发布时间】:2023-04-04 06:00:02
【问题描述】:
根据我的阅读和理解,每个对象在尝试访问同步方法时都会发生锁定。 这是我的代码(在 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”设为静态并改为写这个(在 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" );
}
}
这会按我预期的方式工作,并且输出之间不会发生冲突。例如,如果主线程首先进入了同步方法,那么其他线程将不得不等到主线程完成该方法。
我在这里要问的问题是这种变化如何影响程序的行为?为什么?
【问题讨论】:
-
由于您没有显示意外输出的示例,因此很难看出您的问题。
标签: java multithreading synchronization