我有这段代码。
public class Main{
public static void main(String[] args) {
Main1 main1 = new Main1();
Main2 main2 = new Main2();
Thread t1 = new Thread(main1);
Thread t2 = new Thread(main2);
t1.start();
t2.start();
}
}
public class Main1 extends Thread{
SynchronizedCounter c = new SynchronizedCounter();
public void run(){
System.out.println("Entering Main1");
c.print();
System.out.println("Exiting Main1");
}
}
public class Main2 extends Thread{
SynchronizedCounter c = new SynchronizedCounter();
public void run(){
System.out.println("Entering Main2");
c.print();
System.out.println("Exiting Main2");
}
}
public class SynchronizedCounter {
public void print() {
for(int i = 1; i<10; i++){
System.out.print(i+ " ");
}
}
}
当我运行这段代码时,我得到了不同的输出,我明白为什么。为了使其同步,我在SynchronizedCounter类中的print()中添加了synchronized关键字。 现在,它看起来像这样。
public class SynchronizedCounter {
public synchronized void print() {
for(int i = 1; i<10; i++){
System.out.print(i+ " ");
}
}
}
但是,当我运行它时,我仍然得到随机结果。 我不知道如何通过使方法同步来使其同步,这样,它就会给出固定的结果。
例如:
Entering Main1
1 2 3 4 5 6 7 8 9
Exiting Main1
Entering Main2
1 2 3 4 5 6 7 8 9
Exiting Main2
编辑:感谢 Kayaman 的回答。现在工作正常。我只是对代码做了一点改动。现在看起来像这样。
public class Main{
public static void main(String[] args) {
SynchronizedCounter c = new SynchronizedCounter();
Main1 main1 = new Main1(c);
Main2 main2 = new Main2(c);
Thread t1 = new Thread(main1);
Thread t2 = new Thread(main2);
t1.start();
t2.start();
}
}
public class Main1 extends Thread{
SynchronizedCounter c;
Main1(SynchronizedCounter counter){
c = counter;
}
public void run(){
c.print();
}
}
public class Main2 extends Thread{
SynchronizedCounter c;
Main2(SynchronizedCounter counter){
c = counter;
}
public void run(){
c.print();
}
}
public class SynchronizedCounter {
public static int i = 0;
public synchronized void print() {
System.out.println("\n Thread "+ i);
i++;
for(int i = 1; i<10; i++){
System.out.print(i+ " ");
}
}
}
现在,输出是:
Thread 0
1 2 3 4 5 6 7 8 9
Thread 1
1 2 3 4 5 6 7 8 9
最佳答案
线程需要使用相同的 SynchronizedCounter
实例才能实现同步。由于您的代码中有 2 个实例,因此两个线程都能够在自己的实例上同步并且不会阻塞。
关于java - 如何使用同步方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31960017/