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机房,在经历了推送+ ...
随机推荐
- 抄录的Linux命令
daemon daemon 有一个很高大上的中文名字,叫 守护进程 . 有句话是这么说的,如果 Unix 中没有了守护进程,那么 Unix 就不会是相同的. 它很有个性,是一个运行在后台且不受终端控制 ...
- matlab之编写函数m文件计算排列组合Cnm
function y=myfun(n) y=1; for i in 1:n; y=y*(m-i+1)/i; end 给y赋初值 给i遍历 计算每一项的乘积之和 注意:要保存函数的名字为myfun,因为 ...
- Java 基础篇之IO
IO Java IO 流使用了一种装饰器设计模式,它将 IO 流分成底层节点流和上层处理流,其中节点流用于和物理节点直接关联,程序可以把不同物理节点流包装成统一的处理流,从而允许程序使用统一的输入.输 ...
- vue-cli@webpack@4打包分析命令
一.命令 npm run build --report 该命令在打包完之后,可以分析包的大小(如下图),从而分析那一块打包太大了可以进行优化处理.
- linux内核开源代码地址下载
https://www.kernel.org/pub/linux/kernel/v2.6/
- 解决MFC实际运行对话框与测试对话框显示效果不一致问题
1.打开#include "stdafx.h"头文件文档 2.在末尾加上#define _UNICODE即可
- PDO简单的DB类封装
<?php class DB{ private $dbs = ""; private $fields = "*"; private $tables = n ...
- vue 评论 computed watch 分隔符 局部组件 全局组件 子传父消息|父传子消息
评论案例 splice: (start 几位,替换(新增)内容) splice(0,0,内容)在头部插入内容 splice(0,1) 把索引为0的往后删除1位 splice(0,1,内容)把索引为0 ...
- wc、iconv命令
一.wc:统计文件打印换行符,单词和字节数 语法: wc [OPTION] ... [FILE] ... wc [OPTION] ... --files0-from = F 描 ...
- sort()方法的用法,参数以及排序原理
sort() 方法用于对数组的元素进行排序,并返回数组.默认排序顺序是根据字符串Unicode码点.语法:arrayObject.sort(sortby):参数sortby可选.规定排序顺序.必须是函 ...