Java 如何使用同步方法?

Java 如何使用同步方法?,java,synchronization,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 c

我有这段代码

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+ " ");
        }
    }
}
编辑:谢谢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+ " ");
    }
 }
}

线程需要使用相同的
SynchronizedCounter
实例才能进行同步。由于代码中有2个实例,两个线程将能够在各自的实例上同步,而不会阻塞。

正如其他人所述,将
synchronized
放在方法上会在类的实例上同步,并且由于有2个实例,因此实际上不会同步两个线程

所以根据你的需要

  • 在两个线程中使用相同的同步计数器实例,或
  • 将synchronized块放在方法内部(在主体周围)并在类上同步,即
    synchronized(SynchronizedCounter.class){…}
编辑:

对预期输出的注释:由于您没有同步线程的
run()
方法,因此此处的打印语句,例如
System.out.println(“输入Main1”)可能仍然会混合,即即使计数器正确同步,您仍然可以得到类似的结果(顺便说一句,打印数字后没有换行符,我假设您会添加它):


我很困惑。您正在尝试测试的内容。电流输出是多少?这里没有要测试的同步点。您要解决的问题到底是什么?目前,您必须在控制台上同时写入1-9的线程。由于两人同时向同一个控制台写入数据,因此输出结果是随机的。@FlorianSchaetz我想这只是一次学习经验。事实上,如果同步有效,他应该连续两次得到1-10,而不是混合数字——我想这是他所期望的。是的,这是一个简单的学习练习:)
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
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 
 Entering Main2
 Entering Main1
 1 2 3 4 5 6 7 8 9 
 Exiting Main2
 1 2 3 4 5 6 7 8 9 
 Exiting Main1