java线程基础巩固---通过实验分析This锁和Class锁的存在
This锁:
关于什么是This锁下面用实现来说明一下它:

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

看结果:

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

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

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

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

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

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

其实This锁很好理解,This当然是锁的同一个对象嘛,而声明在实例方法上的同步锁当然也就是This锁喽。
【注意】:所以关于同步锁要想让多线程执行的不同方法达到同步的效果则必须上的是同一把锁才行。
Class锁:
跟This锁类似,Class锁顾名思议就是锁的一个类本身,而非类的实例,下面举例说明:

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

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


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

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

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

可见m3()并未立马执行,因为首先得执行完静态代码块之后,才能到静态方法,虽说m3()木有加静态锁。
java线程基础巩固---通过实验分析This锁和Class锁的存在的更多相关文章
- java线程基础巩固---多线程死锁分析,案例介绍
之前已经学习了关于同步锁的知识,但是在实际编写多线程程序时可能会存在死锁的情况,所以这次来模拟一下死锁,并且学会用一个命令来确认是否程序已经出现死锁了,下面开始: 首先新建两个类: 此时当然得到Oth ...
- java线程基础巩固---如何实现一个自己的显式锁Lock
拋出synchronized问题: 对于一个方法上了同锁如果被一个线程占有了,而假如该线程长时间工作,那其它线程不就只能傻傻的等着,而且是无限的等这线程工作完成了才能执行自己的任务,这里来演示一下这种 ...
- Java线程池ThreadPoolExecutor使用和分析(一)
相关文章目录: Java线程池ThreadPoolExecutor使用和分析(一) Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理 Java线程池Thr ...
- Java线程池ThreadPoolExecutor使用和分析(三) - 终止线程池原理
相关文章目录: Java线程池ThreadPoolExecutor使用和分析(一) Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理 Java线程池Thr ...
- java线程池ThreadPoolExector源码分析
java线程池ThreadPoolExector源码分析 今天研究了下ThreadPoolExector源码,大致上总结了以下几点跟大家分享下: 一.ThreadPoolExector几个主要变量 先 ...
- Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理
相关文章目录: Java线程池ThreadPoolExecutor使用和分析(一) Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理 Java线程池Thr ...
- Java线程基础知识(状态、共享与协作)
1.基础概念 CPU核心数和线程数的关系 核心数:线程数=1:1 ;使用了超线程技术后---> 1:2 CPU时间片轮转机制 又称RR调度,会导致上下文切换 什么是进程和线程 进程:程序运行资源 ...
- Java 线程基础
Java 线程基础
- java线程数过高原因分析
作者:鹿丸不会多项式 出处:http://www.cnblogs.com/hechao123 转载请先与我联系. 一.问题描述 前阵子我们因为B机房故障,将所有的流量切到了A机房,在经历了推送+ ...
随机推荐
- Python3 Selenium自动化web测试 ==>FAQ:隐式等待和sleep区别
FAQ: 情景1: 设置等待时间 A方法:sleep 线程休眠,但只单次有效,其他操作需要加载等待时间,需要再次添加time.sleep() B方法:implicitly_wait() from se ...
- Unity热更新 xLua
xLua是Unity3D下Lua编程解决方案,自2016年初推广以来,已经应用于十多款腾讯自研游戏,因其良好性能.易用性.扩展性而广受好评.现在,腾讯已经将xLua开源到GitHub. 2016年12 ...
- 线程回调,线程中的队列,事件,greenlet模块,gevent模块,自定义补丁, 单线程实现并发,协程
1.线程回调 在线程池/进程池每次提交任务,都会返回一个表示任务的对象,Future对象Future对象具备一个绑定方法,add_done_callback 用于指定回调函数 add 意味着可以添加多 ...
- JMeter—压力测试&性能测试工具
安装 下载 官方网站下载最新版本: http://jmeter.apache.org/download_jmeter.cgi,使用JMeter依赖jdk,建议安装jdk 1.6版本以上. 环境变量配置 ...
- 【图像处理】FFmpeg解码H264及swscale缩放详解
http://blog.csdn.net/gubenpeiyuan/article/details/19548019 主题 FFmpeg 本文概要: 本文介绍著名开源音视频编解码库ffmpeg如何 ...
- 前端H5中JS用FileReader对象读取blob对象二进制数据,文件传输
HTML5中的Blob对象只是二进制数据的容器,本身并不能操作二进制,故本篇将对其操作对象FileReader进行介绍. FileReader FileReader主要用于将文件内容读入内存,通过一系 ...
- mysql数据库之单表查询多表查询
单表查询 前期表准备 create table emp( id int not null unique auto_increment, name varchar(20) not null, sex e ...
- Tensorflow安装错误Cannot uninstall wrapt
解决办法:安装之前先执行:pip install wrapt --ignore-installed
- package[golang]学习笔记之context
*关于context https://talks.golang.org/2014/gotham-context.slide#29
- C/S软件方案
互联网时代客户端软件的一些方案 纯Native开发, C++/C#/duilib+C++(Windows), Objective-c(Mac) Qt(Windows/Mac) NW.js/Electr ...