chasing鱼 2024-05-20 09:40 采纳率: 50%
浏览 1
已结题

同步锁,那个线程安全,如何给一行代码枷锁


pubic class SyncThread{
    public  syncThread void method (){
        //todo
    }
}

public class Child entends SyncThread{
    
    //方法一
    public syncThred void method1(){
        //todo
    }
    
    //方法二
    public void method2(){
    
        super.method();
    }
    
    public static void main(String args[]){
        
        Chid c = new Chid();
        
        c.method1();
        c.method2();
        c.method();
        
        //这三个线程都安全吗?
        
        
    
    }
    
}

这几个线程都安全吗?

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-20 09:40
    关注

    引自免费微信小程序:皆我百晓生

    在Java中,要确保多线程环境下的代码是线程安全的,可以使用synchronized关键字。在上述代码中,如果你想保护SyncThread类中的method()方法使其线程安全,可以在方法声明前加上synchronized关键字。这样,当一个线程访问这个同步方法时,其他线程必须等待当前线程执行完毕才能进入。

    修改后的代码如下:

    public class SyncThread {
        public synchronized void method() {
            // todo
        }
    }
    
    public class Child extends SyncThread {
    
        // 方法一
        public void method1() {
            // todo
        }
    
        // 方法二
        public void method2() {
            super.method();
        }
    
        public static void main(String[] args) {
    
            Child c = new Child();
    
            c.method1(); // 这个方法没有被synchronized,不会阻塞其他线程
            c.method2(); // 这个方法会调用父类的synchronized方法,如果有多个线程同时调用,只有一个线程能执行
            c.method(); // 同样是synchronized方法,受同一把锁保护
    
            // 对于这三种情况,只有`method()`是线程安全的,因为它被`synchronized`修饰了。
            // `method1()`不受锁保护,因此不是线程安全的。
            // 而`method2()`通过`super.method()`间接调用了`synchronized`方法,所以它也是线程安全的,但要注意的是,这里并不是因为`method2()`本身是同步的,而是因为它调用了同步的方法。
        }
    }
    

    在这个例子中,method()是线程安全的,而method1()不具有任何同步特性,因此不是线程安全的。然而,由于method2()调用了SyncThread类的同步方法,所以当多个线程同时调用method2()时,它们会被调度,保证只有一个线程执行method()。这意味着method2()在这种情况下也是线程安全的,但这并非因为它自身被标记为同步,而是因为它的行为依赖于一个同步方法。

    为了保持代码简洁明了,建议将共享资源的操作(可能引起竞争条件的)封装在一个或多个同步方法中,而不是在所有子类的方法上都进行同步。这样可以使代码更易于理解和维护。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 5月28日
  • 已采纳回答 5月20日
  • 创建了问题 5月20日

悬赏问题

  • ¥15 CCF-CSP 2023 第三题 解压缩(50%)
  • ¥30 comfyui openpose报错
  • ¥20 Wpf Datarid单元格闪烁效果的实现
  • ¥15 图像分割、图像边缘提取
  • ¥15 sqlserver执行存储过程报错
  • ¥100 nuxt、uniapp、ruoyi-vue 相关发布问题
  • ¥15 浮窗和全屏应用同时存在,全屏应用输入法无法弹出
  • ¥100 matlab2009 32位一直初始化
  • ¥15 Expected type 'str | PathLike[str]…… bytes' instead
  • ¥15 三极管电路求解,已知电阻电压和三级关放大倍数