1

我试图synchronized从以下示例中理解关键字

JavaMain方法 -->

public int methodA(){

  Hello h = new Hello();
  h.callSomeSynchronizedMethod();    

  sysout("Main");
  return 0;    

}

Hello课堂上-->

public synchronized void callSomeSynchronizedMethod(){
   Hi h = new Hi();

   h.someMethod();

   sysout("Hello");

}

Hi课堂上

public void someMethod(){

    sysout("Hi");
}

那么我将得到的输出列表是什么?

1.) 它的顺序是Hi, Hello and Main

2.) 我对 synchronized 关键字的理解是它只会执行一个方法,然后执行另一个,没有多线程。它是否正确 ?

4

4 回答 4

1

你会得到“Hi”,然后是“Hello”,然后是“Main”,是的。synchronized 修饰符与调用方法的顺序无关;而且,除了增加一点开销之外,在单个线程中运行代码时它什么都不做。您可以在没有同步的情况下运行相同的测试并获得相同的结果。

现在,如果您在多个线程调用这些方法的情况下运行类似的测试,您的结果将不太确定。

同步意味着允许在多线程环境中更安全地执行代码和管理资源。

http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html

希望这可以帮助。

于 2012-12-19T13:18:52.850 回答
1

要真正了解什么是同步的,您需要运行该程序两次,一次同步,一次不同步。此外,您的程序应该使用多个线程。所以这里是这样一个测试的例子。

public class Synchro {

    public static void main(String args[]){
        new Synchro();
    }

    public Synchro(){
        final Moo moo = new Moo();
        Thread t = new Thread(new Runnable(){
           public void run(){
               moo.aMethod("Second");
           }
        });
        t.start();//calling the method in a thread

        moo.aMethod("First");//calling the same method from the same object in the main thread
     }

 class Moo{     
    public Moo(){            
    }

    public void aMethod(String name){
        //this loop just prints slowly so you can see the execution
        for(int i = 1; i <= 100; i++){
            System.out.println(String.format("%s : %d", name, i));
            try{
                Thread.sleep(50);
            }catch(InterruptedException e){}
        }
    }
  }

}

现在,如果您运行上述代码,注意到该方法未同步,您将看到该方法的两次执行交错的打印输出。也就是说,您将看到 First 1,然后是 Second 1,然后是 First 2,依此类推。

现在,将 synchronized 关键字添加到制作它的方法中:

  public synchronized void aMethod(String name){ ....

并再次运行代码。这一次,方法的一个执行在另一个开始之前完成。

仅当多个线程访问同一个对象时,才需要使用 synchronized 关键字。

于 2012-12-19T13:24:56.837 回答
0

所有这些方法都将在一个线程中执行,因此第一个问题的答案是“是”。

synchronized关键字 emans 表示该方法每时每刻只能在一个线程中执行。因此,如果您从另一个线程调用它 - 它会等到第一个线程中的执行完成。

于 2012-12-19T13:18:30.360 回答
0

在 Java 中没有自动多线程:您必须显式地启动一个线程并向其传递一个run它将执行的方法。只有在这种情况下,synchronized关键字才会开始起作用,但它的含义并不像您所理解的那样:方法将在调用它们的任何线程中执行,但是当一个线程正在执行时,另一个线程将在它能够执行方法之前阻塞由同一把锁守卫。

于 2012-12-19T13:22:47.940 回答