当前位置: 首页 > 知识库问答 >
问题:

在多线程中同步

罗智志
2023-03-14

当我尝试通过启动不同的线程来执行所有同步方法时,我在一个类中有三个同步方法,我看不到同步的输出,在对象上没有获得锁

公共类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);

}

} 线程 3 类:

包装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);
}

}

使用main方法生成不同线程的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();

}

}

以下是输出结果:

你好你好我31岁你好我31岁你好你好我31岁你好你好你好我31岁你好你好你好我31岁你好你好你好我31岁你好你好你好我31岁你好你好你好 你好吗你好吗你好吗你好吗你好吗你好吗你好吗你好吗你好吗你好吗你好吗你好吗你好阿里特姓乌尔库德你好你好你好阿里特姓乌尔库德你好你好你好你好你好你好你好阿里特姓乌尔库德你好你好你好你好 你好你好你好你好阿里特你好你好你好你好你好你好阿里特你好你好你好你好你好你好你好阿里特你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好

共有2个答案

卫梓
2023-03-14

添加到静态方法的synchronized关键字是到当前的*。对应于类锁的java文件;而synchronized关键字添加到非静态方法中就是给这个对象加锁。虽然这两种锁是不同的,但是这种对象锁和类锁是可以互相重入的。

史高阳
2023-03-14

根据您的代码,您看到的输出完全有效MyThread正在使用DisplayMessage。sayHello()方法,它是静态,因此在DisplayMessage上同步。class</code>对象。在static方法上使用synchronized关键字相当于:

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);
        }
    }
}

另一方面,另外两个线程,< code>MyThread2和< code>MyThread3正在调用非静态方法- sayHello1和< code>sayHello2,它们在< code>this上同步。在这种情况下,使用< code>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中多线程同步类 CountDownLatch,包括了Java中多线程同步类 CountDownLatch的使用技巧和注意事项,需要的朋友参考一下 在多线程开发中,常常遇到希望一组线程完成之后在执行之后的操作,java提供了一个多线程同步辅助类,可以完成此类需求: 类中常见的方法: 其中构造方法: CountDownLatch(int count) 参数count是计数器,一般

  • 现在我的问题是:关键字对这种情况有用吗?

  • 我创建了一个多线程步骤,最大线程限制为10; 在处理了200万条记录文件后,我可以在日志文件中看到创建的线程太多,即使我将限制设置为10个线程。你能告诉我为什么吗?非常感谢。 2019-07-02T17:02:298968129857信息[batch-thread35348]com。db。wmdl。价格档案。工作一批听众。PriceFileReaderListener([])-PriceFileR

  • 本文向大家介绍详解C#多线程之线程同步,包括了详解C#多线程之线程同步的使用技巧和注意事项,需要的朋友参考一下 多线程内容大致分两部分,其一是异步操作,可通过专用,线程池,Task,Parallel,PLINQ等,而这里又涉及工作线程与IO线程;其二是线程同步问题,鄙人现在学习与探究的是线程同步问题。 通过学习《CLR via C#》里面的内容,对线程同步形成了脉络较清晰的体系结构,在多线程中实现

  • 线程2:4 . . 线程3:7 线程3:8 线程1:9 这是我为正在执行线程的类编写的代码 我认为问题在于NumberEntry对象的创建。但我不太确定怎么修好它。如果有人能以任何方式帮助我,那就太好了:)。

  • 互斥锁 互斥锁的本质是当一个 goroutine 访问的时候,其它 goroutine 都不能访问 这样就能实现资源同步,但是在避免资源竞争的同时也降低了程序的并发性能,程序由原来的并发执行变成了串行 案例 有一个打印函数, 用于逐个打印字符串中的字符,有两个人都开启了goroutine去打印 如果没有添加互斥锁,那么两个人都有机会输出自己的内容 如果添加了互斥锁,那么会先输出某一个的,输出完毕之