Java synchronized关键字问题

时间:2012-12-19 13:11:22

标签: java synchronized

我正在尝试从以下示例中了解关键字synchronized

Java Main方法 - >

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关键字的理解是它只执行1个方法然后执行另一个方法,而不需要多线程。这是对的吗?

4 个答案:

答案 0 :(得分:1)

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

现在,如果你运行了一个类似的测试,其中多个线程正在调用这些方法,那么你的结果就不那么确定了。

Synchronized旨在允许在多线程环境中更安全地执行代码和管理资源。

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

希望这有帮助。

答案 1 :(得分: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关键字。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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