This锁:

关于什么是This锁下面用实现来说明一下它:

那下面用两个线程分别调用这两个方法,如下:

看结果:

可见两个方法是同时输出的,因为m2()方法并未上锁,所以就不存在争锁的问题,那这时给m2()方法也加上同步锁,如下:

那此时两个线程调用的m1()、m2()方法能同时执行么,看结果:

很显然这次就不是同时执行了,而是哪个线程抢到了锁谁就执行,而另外一个方法则会等待锁释放了再执行,其时这个同步方法上的锁就是This锁,下面咱们手动定义一个锁,将程序再改造改造:

也就是说两个方法的锁不一样,那结果如何呢?

因为两个方法是不同的锁,所以当然各自都可以执行喽,同样如果将m1()方法的This锁改为咱们自己写的锁:

其结果应该跟同时加了This锁一样,谁先抢到锁谁就执行方法,而没抢到的则需等待锁释放之后才能执行,如下:

其实This锁很好理解,This当然是锁的同一个对象嘛,而声明在实例方法上的同步锁当然也就是This锁喽。

【注意】:所以关于同步锁要想让多线程执行的不同方法达到同步的效果则必须上的是同一把锁才行。

Class锁:

跟This锁类似,Class锁顾名思议就是锁的一个类本身,而非类的实例,下面举例说明:

接下来用两个线程分别调一下这两个方法,并看结果:

那如果再定义一个m3()方法,然后它不加锁,这时再开启一个线程来执行它,如下:

其结果可想而知:m3()肯定立马就可以执行到喽,如下:

而对于static静态代码块我想应该都很熟悉,像JNI调用加载so库不就是在它里面执行的么,接下来在它里面也加个同步锁看看效果:

这时再看m3()方法能否立马能执行:

可见m3()并未立马执行,因为首先得执行完静态代码块之后,才能到静态方法,虽说m3()木有加静态锁。

最新文章

  1. POJ2282:The Counting Problem(数位DP)
  2. a*b(高进度乘以int类型的数)
  3. jquery 三种开始写法
  4. Java魔法堂:打包知识点之META-INF/MAINFEST.MF(转)
  5. Oracle的总体回顾
  6. JavaScript高级程序设计:第七章
  7. java类固定值代替基表写法
  8. c++ 异常 discards qualifiers 丢弃
  9. Android Studio下jni应用
  10. 用int还是用Integer?
  11. SSM 项目从搭建爬坑到 CentOS 服务器部署 - 速查手册
  12. unity项目针对IOS及Android平台的音频压缩格式
  13. s:iterator数据累加示例代码
  14. ceph的image扩容
  15. poj 1018 Communication System (枚举)
  16. [转] 浏览器自动化测试初探:使用 phantomjs 与 casperjs
  17. ubuntu cp(copy) command
  18. sqlserver用户角色相关的权限
  19. Linux内核中的中断栈与内核栈的补充说明【转】
  20. ORACLE 表空间使用率查询

热门文章

  1. MySQL学习-MySQL内置功能_事务操作
  2. Spring源码分析(1)容器的基本实现——核心类介绍
  3. 部署kubernetes-prometheus和用kubespray部署kubernetes后修改kubelet的
  4. RDP爆破方式攻击防控思路梳理
  5. 使用Java实现hello/hi的简单网络聊天程序
  6. setsockopt用法详解
  7. n*n矩阵 每行每列XOR为0(思维)
  8. vue技术分享之你可能不知道的7个秘密
  9. T100——取得系统参数值,如关帐日期
  10. CSS和DOM入门