zoukankan      html  css  js  c++  java
  • synchronized修饰方法和代码块的区别

    先看一段代码

    Class A {
    
        public synchronized methodA() {//对当前对象加锁
    
        }
    
        public  methodB() {
    
                   synchronized(this){}//对当前对象加锁,与methodA用法相同
    
        }
    
        public static synchronized methodC() {}//对类加锁,即对所有此类的对象加锁
    
        public methodD(){
    
                    synchronized(A.class){}//对类加锁,即对所有此类的对象加锁
    
        }
    
    }

    synchronize用法关键是搞清楚对谁加锁,methodA,和methodB都是对当前对象加锁,即如果有两个线程同时访问同一个对象的methoA和methodB则会发生竞争,必须等待其中一个执行完成后另一个才会执行。如果两个线程访问的是不同对象的methodA和methodB则不会竞争。

    methodC和methodD是对类的class对象加锁,methodC和methodD的加锁对象一样,效果也一样。如果两个线程同时访问同一个对象的methodC和methodD是会发生竞争的,两个线程同时访问不同对象的methodC和methodD是也是会发生竞争的,如果两个线程同时访问methoA/B 和methodC/D则不会发生竞争,因为锁对象不同。

  • 相关阅读:
    Oracle 更改DBID
    Oracle 修改字段长度
    Oracle 索引
    Oracle在无法打开数据库的状态下获取DBID
    Oracle 备份脚本
    Linux crontab计划任务
    Oracle restore和recovery的区别
    Django基础
    面向对象(一)
    socket
  • 原文地址:https://www.cnblogs.com/shamo89/p/8953116.html
Copyright © 2011-2022 走看看