java - 如何使用同步方法?

标签 java synchronization

我有这段代码。

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/

相关文章:

java - 为什么使用保留 fragment 来通过配置更改来保持状态?

java - Android中sqlite和sql server(crud操作)两种方式同步

java - 生产者消费者没有给出期望的结果

java - 如果满足条件,则以原子方式写入两个变量

java - Java中如何通过分段请求上传大文件?

java - 卢塞恩 3 : Where is StandardAnalyzer?

java - MulticastSocket 未打开端口

Java String 被替换为区分大小写

java - Java 中 'this' 可以通过哪些方式转义?

Javascript同步-等待setTimeOut完成,如果可能的话不回调