这是我的代码:
public class ThreadDemo {
public static void main(String args[]) throws Exception {
Printer[] printers = new Printer[5];
printers[0] = new Printer("@base");
printers[1] = new Printer("#try");
printers[2] = new Printer("!test");
printers[3] = new Printer("^hello");
printers[4] = new Printer("*world");
for (Printer x : printers) {
x.start();
}
try {
for (Printer y : printers) {
y.join();
}
} catch (InterruptedException e) {
System.out.println(e);
}
}
}
class Printer extends Thread {
public Printer(String name) {
super(name);
}
public void run() {
print();
}
public synchronized void print() {
for (int i = 0; i < 10; i++) {
System.out.print(getName().charAt(0));
try {
sleep(100);
} catch (InterruptedException e) {
System.out.println(e + " occured");
}
}
}
}其结果是
@^!#**@^!#*#@!^@*#^!#^!*@^*@!#@!#*^@#^!*!@^#*#@*^! 我的期望是,所有符号都将被序列化为@^,而线程则是根据它首先启动的。
调用睡眠()将允许其他线程继续到当前线程的休眠时间,但是我想同步方法不应该是这样的。
发布于 2019-02-05 15:08:34
@SolomonSlow -那么它必须被更正为“没有同步方法”可以同时在同一个对象上调用?
关于同步实例方法,您只需要了解一件事。你得知道这个..。
synchronized void Foobar() { ... }...Is只是编写同步块的一种快捷方式。
void Foobar() {
synchronized (this) {
...
}
}这两个方法声明所做的事情完全相同。因此,您所知道或了解的有关同步块行为的所有知识也可以应用于同步方法。
关于synchronized块,最重要的是:“任何两个线程都不能同时在同一个对象上同步。”如果您理解这一点,并且知道同步方法如何只是同步块的快捷方式,那么您可以回答自己的问题。
https://stackoverflow.com/questions/51732671
复制相似问题