我正在尝试从以下示例中了解关键字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个方法然后执行另一个方法,而不需要多线程。这是对的吗?
答案 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
关键字才会起作用,但它的含义并不像你理解的那样:方法将在任何调用它们的线程中执行,但是当一个执行时,另一个线程会阻塞之后才能执行由同一个锁保护的方法。