Java - 线程锁 — Synchronized(同步锁)

in TCEHJava with 0 comment

synchronized是java中的一个关键字,也就是说是Java语言内置的特性。
如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,并执行该代码块时,其他线程便只能一直等待,等待获取锁的线程释放锁,而这里获取锁的线程释放锁只会有两种情况:

1)获取锁的线程执行完了该代码块,然后线程释放对锁的占有;

2)线程执行发生异常,此时JVM会让线程自动释放锁。

synchronized 修饰的几种情况

对动态方法的修饰。

作用的是调用该方法的当前对象(或者说对象引用)。

    public synchronized void doSomething(){}

对代码块的修饰。

作用的是调用该方法的当前对象(或者说对象引用)。

    public  void  increaseAmt(float increaseAmt){

        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        synchronized (this) {
            System.out.println(this);
            amt+=increaseAmt;
        }
    }

对静态方法的修饰。

作用的是静态方法所在类的所有对象(或者说对象引用)。

    public synchronized static  void  increaseAmt(float increaseAmt){
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        amt+=increaseAmt;
    }

对类的修饰。

作用的是静态方法所在类的所有对象(或者说对象引用)。

        public static void outMoney(double money, String mode) throws Exception {
        synchronized (Bank.class) {
            if (Objects.equals(mode, "ATM")) {
                ATM(money);
            } else {
                Counter(money);
            }

        }
    }

参考来源:

https://blog.csdn.net/yangzhaomuma/article/details/51236976

Comments are closed.