线程同步机制-成员变量不是线程安全的

代码如下:

public class Demo02 {
       public static void main(String[] args) {
         Demo02Service service = new Demo02Service();
         Thread threadA = new Demo02ThreadA(service);
         Thread threadB = new Demo02ThreadB(service);
         threadA.start();
         threadB.start();
    }
}

class Demo02Service{
    private int num;
    public void add(String userName){
        if(Objects.equals("a",userName)){
              num=100;
            System.out.println("a is set");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }else
            {
                num=200;
                System.out.println("b is set");
        }
        System.out.println("userName="+userName+", num="+num);
    }
}

class Demo02ThreadA extends Thread{
      private Demo02Service service;
      public Demo02ThreadA(Demo02Service service){
          this.service=service;
      }

    @Override
    public void run() {
        service.add("a");
    }
}

class Demo02ThreadB extends Thread{
    private Demo02Service service;
    public Demo02ThreadB(Demo02Service service){
        this.service=service;
    }

    @Override
    public void run() {
        service.add("b");
    }
}

运行结果:
图片说明
预期结果应该是userName=a时,num=100;说明线程A在睡眠的时候,num值在B线程中被修改了。产生了脏读。如果想要线程同步进行的话,可以在方法加上synchronized锁。

注意!此信息未认证,请谨慎判断信息的真实性!

全部评论
空

相关内容推荐

头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
点赞 评论 收藏
转发
头像
01-07 18:24
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
2022-12-31 20:32
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
2022-12-22 16:38
江苏大学_2023
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
点赞 收藏 评论
分享

全站热榜

正在热议