关于java线程锁synchronized修饰普通方法与静态方法的区别

最近研究线程方面问题,关于这个synchronized锁修饰的问题,先是修饰普通方法,然后通过两个线程,各自执行自己对象的锁,发现方法执行互不影响,代码如下:

  private static int num=0;
  private synchronized void printNum(String tag){
    try {
    if(tag.equals("a")){
      num=100;
      System.out.println("tag a,num set over!");
      Thread.sleep(1000);//休眠1秒
    }else{
      num=200;
      System.out.println("tag b,set num over!");
    }
  } catch (InterruptedException e) {
    e.printStackTrace();
  }
  System.out.println("tag :" +tag+", num="+num);
  }
  public static void main(String[] args) {
    MyThread02 my1=new MyThread02();
    MyThread02 my2=new MyThread02();
    //匿名内部类方式启动线程
    new Thread(()->my1.printNum("a")).start();
    new Thread(()->my2.printNum("b")).start();
  },

执行结果如下,即可能一个线程刚设置完num,另一个线程来再来设置num,两个线程两个锁没有任何影响.

tag a,num set over!
tag b,set num over!
tag :b, num=200
tag :a, num=200

但是如果修饰的是静态方法,发现打印顺序就是一致的,也就是说此时这个方法同时只能一个线程执行,结果不变如下:

tag a,num set over!
tag :a, num=100
tag b,set num over!
tag :b, num=200

后面百度了解到,在多个线程多个锁的情况下,

如果synchronized修饰在普通方法上,线程之间互无关系,可任意执行自己对象的锁
如果在static方法上修饰synchronized表示锁定了class类.多个线程都是相同的一把锁,即
取得的锁都是对象锁,哪个线程先执行代码,哪个线程就持有该方法所属的对象锁,其他对象就无法执行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`synchronized` 关键字用于控制线程对共享资源的访问,确保在任一时刻只有一个线程能执行该代码块或方法。在 Java 中,将 `synchronized` 修饰静态方法和非静态(实例)方法会带来一些不同: 1. 静态同步 (synchronized static): - 当在静态方法上使用 `synchronized` 时,是对当前类(Class 对象)的引用,而不是具体的对象实例。这意味着所有对该类的调用都会共享同一把,无论它们来自哪个对象。 - 因此,如果两个不同的线程同时持有这个类的静态,那么只有其中一个能够执行静态同步的方法。 - 好处在于简化了定管理,因为不需要为每个实例创建独立的。但这也意味着线程之间的可见性和状态一致性可能不像基于实例的同步那么容易理解。 2. 实例同步 (synchronized on instance): - 在实例方法上使用 `synchronized`,是该方法所在的对象实例。每个调用该方法的具体对象都会获得自己的,所以并发地调用相同方法的不同对象是可以并行执行的。 - 这有助于维护每个对象的状态独立性,但需要更精确地管理,尤其是当多个方法需要互斥访问同一个实例变量时。 - 如果一个类的所有实例都需要同步,那通常使用静态更为合适,因为静态更容易管理和避免死。 总结一下,关键区别在于: - 静态同步适用于类级别的资源共享,所有对象共享一把; - 实例同步针对单个对象,每个实例有自己的,适合处理特定对象的数据并发操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值