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);
}
}
}
参考来源:
本文由 Administrator 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站部分文章采集自互联网,因某些原因未注明出处,如有侵权,请留言告知。