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