当我尝试通过启动不同的线程来执行所有同步方法时,我在一个类中有三个同步方法,我看不到同步输出,没有在对象上获得锁,我可以在输出中看到所有线程同时执行。下面是我的代码。赞赏输入。谢谢

公共类DisplayMessage {

public static synchronized void sayHello(String name) throws InterruptedException{
    for(int i=1; i<=10;i++){
        Thread.sleep(1000);
        System.out.println("How are you"+name);
    }
}
public synchronized void sayHello1(String name2,int j){
    for(int i=1; i<=10;i++){
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("How are you Hello1  :: "+name2+ " Age " + j);
    }
}
public synchronized void sayHello2(String name3,String lastname){
    for(int i=1; i<=10;i++){
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("How are you Hello 2 :: "+ name3 + " lastname " +lastname);
    }
}


}
线程类:

公共类MyThread扩展了线程{

String name;


MyThread(String name) {

    this.name = name;
}

public void run() {

    try {
        DisplayMessage.sayHello(name);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}


}
Thread2类:
公共类MyThread2扩展了线程{

String name2;
String name3;

int age;
DisplayMessage dm;

MyThread2(DisplayMessage dm, String name2, int age) {
    this.dm = dm;
    this.name2 = name2;
    this.age = age;
}

public void run() {

    dm.sayHello1(name2, age);

}


}
Thread3类:

包Synchronization.classlock;

公共类MyThread3扩展了线程{

String name3;
String lastname;
int age;

DisplayMessage dm2;

MyThread3(DisplayMessage dm, String name3, String lastname) {
    this.dm2 = dm;
    this.name3 = name3;
    this.lastname = lastname;
}

public void run() {

    dm2.sayHello2(name3, lastname);
}


}

具有主方法的Democlass产生不同的线程
公共类SynchronizationDemo {

public static void main(String[] args) {
    DisplayMessage dm=new DisplayMessage();
    MyThread t1= new MyThread("steve");
    MyThread t2=new MyThread("Anitha");
    MyThread2 t3=new MyThread2(dm," Amit", 31);
    MyThread3 t4=new MyThread3(dm," Arit ","urkude");
    t1.start();
    t2.start();
    t3.start();
    t4.start();

}


}

以下是输出:

你好吗
你好你好:: Amit年龄31
你好你好:: Amit年龄31
你好吗
你好吗
你好你好:: Amit年龄31
你好吗
你好你好:: Amit年龄31
你好吗
你好你好:: Amit年龄31
你好吗
你好你好:: Amit年龄31
你好吗
你好你好:: Amit年龄31
你好你好:: Amit年龄31
你好吗
你好吗
你好你好:: Amit年龄31
你好吗
你好你好:: Amit年龄31
你好吗Anitha
你好你好2 ::阿里特姓urkude
你好吗Anitha
你好你好2 ::阿里特姓urkude
你好吗
你好你好2 ::阿里特姓urkude
你好吗
你好你好2 ::阿里特姓urkude
你好你好2 ::阿里特姓urkude
你好吗
你好吗
你好你好2 ::阿里特姓urkude
你好吗
你好你好2 ::阿里特姓urkude
你好你好2 ::阿里特姓urkude
你好吗
你好吗
你好你好2 ::阿里特姓urkude
你好吗
你好你好2 ::阿里特姓urkude

最佳答案

根据您的代码,您看到的输出完全有效。 MyThread使用的是DisplayMessage.sayHello()方法,该方法是static,因此在DisplayMessage.class对象上同步。 synchronized方法中static关键字的用法等效于:

public static void sayHello(String name) throws InterruptedException{
    synchronized(DisplayMessage.class) {
        for(int i=1; i<=10;i++){
            Thread.sleep(1000);
            System.out.println("How are you"+name);
        }
    }
}


另一方面,另外两个线程MyThread2MyThread3调用非静态方法-sayHello1sayHello2,它们在this上同步。在这种情况下,synchronized关键字的用法等效于:

public void sayHello1(String name2,int j){
    synchronized(DisplayMessage.this) {
        for(int i=1; i<=10;i++){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("How are you Hello1  :: "+name2+ " Age " + j);
        }
    }
}


因此,您的输出包含并发运行的steveAmit,然后是并发运行的AnithaArit,这是预期的,因为代码在两个不同的对象上同步。

关于java - 在多线程中同步,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43865454/

10-11 05:02