Из того, что я прочитал и понял, каждый объект имеет блокировку, которая происходит, когда он пытается получить доступ к синхронизированному методу.Вот мой код (в 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' и написал бы вместо этого (в классе 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" );
}
}
Это сработало бы так, как я ожидал, и между выходными данными не было бы конфликта.Например, если основной поток первым вошел в синхронизированный метод, то другой поток должен будет дождаться завершения основного потока с этим методом.
Вопрос, который я здесь задаю, состоит в том, как это изменение повлияло на поведениепрограммы?а почему?