synchronized与static synchronized

上次被问到synchronized与static synchronized的区别,虽然知道有区别,但是愣了半晌没想出来理由在哪里,温故而知新,特此记录。

synchronized需要持有对象锁,synchronized持有的是实例对象的锁,因此其只对同一实例保证同步,若需要对所有对象都保持同步,那就需要static synchronized方法了,在class文件被jvm加载之后其实也是一个class对象,static synchronized所持有的便是class对象的锁,而jvm基本能够保证class只被加载一次,也就是只有一个class对象,那么就可以保证该class所有的实例对象操作都能正确同步。

再说到abstract与synchronized,因为abstract申明的方法是没有实现的,而synchronized方法是同步一个方法内的操作,隐含的意思就是方法必须有实现,因此两者不能同时应用于一个方法的申明。

另外,abstract与static、abstract与native也不能同时用于申明一个方法,因为static方法在class文件被加载即被初始化载入内存,而abstract申明的无实现的方法无从谈起初始化;native指示方法是由本地方法,由jvm通过底层操作系统实现,abstract则指示方法由子类实现,两者指示的方法实现都不同,当然也不能同时用了。

package org.mxjun.common;
 
public abstract class HierarchicalTest {
 public abstract void test1();
 
 //被注释掉的方法无法通过编译
 //public static abstract void test2();
 
 //public synchronized abstract void test3();
 
 //public native abstract void test4();
 
 public static synchronized void test5() {
  System.out.println("test5");
 }

 public static void main(String[] args) {
  test5();
 }
}

转载于:https://my.oschina.net/mxjun/blog/381078

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值