synchronized三种使用方式,及锁的类型验证
Synchronized常用三种使用方式
1、修饰普通方法:锁对象即为当前对象
2、修饰静态方法:锁对象为当前Class对象
3、修饰代码块:锁对象为synchronized紧接着的小括号内的对象
一、验证修饰普通方法时锁对象
package com.demo;
public class ThreadTest {
public static void main(String[] args) {
Thread t1 = new MyThread1();
Thread t2 = new MyThread2(t1);
t1.start();// 默认priority=5
t2.start();
t2.setPriority(9);
System.out.println("线程1:" + t1.getState());
System.out.println("线程2:" + t2.getState());
}
}
class MyThread1 extends Thread {
@Override
public void run() {
dosome();
}
public synchronized void dosome() {
System.out.println("mythread1");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("sleep end");
}
}
class MyThread2 extends Thread {
private Object lock;
public MyThread2(Object lock) {
this.lock = lock;
}
@Override
public void run() {
synchronized (lock) {
System.out.println("mythread2");
}
}
}
现象:先逐行输出mythread1,线程1:RUNNABLE,线程2:BLOCKED,之后暂停五分钟,逐行输出sleep end,mythread2
分析:线程2与线程1拥有相同的锁,线程1优先级高于线程2,线程1优先执行,获取到锁,执行sleep,未释放锁,线程2未获取到锁,处于阻塞状态,线程1sleep结束,输出sleep end,并释放锁,线程2获取到锁,执行输出mythread2
结论:当synchronized修饰普通方法时,锁对象即为当前对象
二、验证修饰静态方法时锁对象
对上述代码稍作修改,在dosome方法上添加static关键字,main方法中,线程2对象初始化时,传入MyThread1.class

现象:与上述现象一致
分析:同上
结论:当synchronized修饰静态方法时,锁对象为当前Class对象
三、验证修饰代码块时锁对象
package com.demo;
public class ThreadTest {
public static void main(String[] args) {
Object o = new Object();
Thread t1 = new MyThread1(o);
Thread t2 = new MyThread2(o);
t1.start();
t2.start();
t2.setPriority(9);
System.out.println("线程1:" + t1.getState());
System.out.println("线程2:" + t2.getState());
}
}
class MyThread1 extends Thread {
private Object lock;
public MyThread1(Object lock) {
this.lock = lock;
}
@Override
public void run() {
synchronized (lock) {
System.out.println("mythread1");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("sleep end");
}
}
}
class MyThread2 extends Thread {
private Object lock;
public MyThread2(Object lock) {
this.lock = lock;
}
@Override
public void run() {
synchronized (lock) {
System.out.println("mythread2");
}
}
}
现象:同上
分析:同上
结论:当使用synchronized修改代码块时,其后小括号中的对象即为对象锁。
synchronized三种使用方式,及锁的类型验证的更多相关文章
- 并发编程系列小结(线程安全,synchronized,脏读,线程间的通信wait/notify,线程的三种实现方式Demo,可替代wait/notify的方法)
线程安全: 当多个线程访问某一个类(对象或方法)时,这个类始终都能表现出正确的行为,那么这个类(对象或方法就是线程安全的) synchronized: 可以在任意对象或方法上加锁,而加锁的这段代码称为 ...
- 分布式锁的三种实现方式 数据库、redis、zookeeper
版权声明: https://blog.csdn.net/wuzhiwei549/article/details/80692278 一.为什么要使用分布式锁 我们在开发应用的时候,如果需要对某一个共享变 ...
- Java之线程安全中的三种同步方式
一个程序在运行起来时,会转换为进程,通常含有多个线程. 通常情况下,一个进程中的比较耗时的操作(如长循环.文件上传下载.网络资源获取等),往往会采用多线程来解决. 比如,现实生活中,银行取钱问题.火车 ...
- 【重学Java】多线程基础(三种创建方式,线程安全,生产者消费者)
实现多线程 简单了解多线程[理解] 是指从软件或者硬件上实现多个线程并发执行的技术. 具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程,提升性能. 并发和并行[理解] 并行:在同一时刻, ...
- 通过三个DEMO学会SignalR的三种实现方式
一.理解SignalR ASP .NET SignalR 是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信(即:客户端(Web页面)和服务器端可以互相实时的通知消息 ...
- Hive metastore三种配置方式
http://blog.csdn.net/reesun/article/details/8556078 Hive的meta数据支持以下三种存储方式,其中两种属于本地存储,一种为远端存储.远端存储比较适 ...
- django 模板语法和三种返回方式
模板 for循环 {% for athlete in athlete_list %} <li>{{ athlete.name }}</li> {% endfor %} if语句 ...
- js的三种继承方式及其优缺点
[转] 第一种,prototype的方式: //父类 function person(){ this.hair = 'black'; this.eye = 'black'; this.skin = ' ...
- spring ioc三种注入方式
spring ioc三种注入方式 IOC ,全称 (Inverse Of Control) ,中文意思为:控制反转 什么是控制反转? 控制反转是一种将组件依赖关系的创建和管理置于程序外部的技术. 由容 ...
随机推荐
- java三大框架——Struts + Hibernate + Spring
Struts主要负责表示层的显示 Spring利用它的IOC和AOP来处理控制业务(负责对数据库的操作) Hibernate主要是数据持久化到数据库 再用jsp的servlet做网页开发的时候有个 w ...
- A query was run and no Result Maps were found for...原来是mapper.xml文件出了问题,是使用MyBatis最常见的一种错误
今天遇到一个问题,原来是mapper.xml文件出了问题,是使用MyBatis最常见的一种错误 报错的结果是这样的: A query was run and no Result Maps were f ...
- php生成器yield
上次说了php的生成器Iterator,这次说一下yield 迭代生成器 (迭代)生成器也是一个函数,不同的是这个函数的返回值是依次返回, 而不是只返回一个单独的值.或者,换句话说,生成器使你能更方便 ...
- 【JAVASCRIPT】call和apply的用法以及区别
function add(c,d){ return this.a + this.b + c + d; } var s = {a:"鸡", b:"你"}; con ...
- Python——缓冲区
原创声明:本文系博主原创文章,转载及引用请注明出处. 1. 在Python中,字符串和整型对象都是不可变的(immutable)类型,因此Python会很高效地缓存它们. 2. Python2.3简单 ...
- hive 权限知识点整理
一,hive 权限授权模型 1.Storage Based Authorization in the Metastore Server基于存储的授权(也就是HDFS的授权模型) - 可以对Metast ...
- 重新学习ESP32(零)之环境搭建——转载——windows平台
原文来自:https://www.makingfun.xyz/2018/09/18/esp32-hello-world/ 前言 前几天看到乐鑫的公众号推送了一篇文章,说是ESP8266最新的SDK风格 ...
- @Valid与@Validated
Spring Validation验证框架对参数的验证机制提供了@Validated(Spring's JSR-303规范,是标准JSR-303的一个变种),javax提供了@Valid(标准JSR- ...
- typescript枚举字符串型不能使用函数问题
数字型枚举 enum OrderStatus { Start = 1, Unpaid, Shipping, Shipped, Complete } 或者 enum OrderStatus { Star ...
- jmeter+jenkins+git+ant
摘自:https://www.cnblogs.com/syw20170419/p/10732167.html 使用场景: 多人协作,共同完成脚本的编写,脚本之间进行合并后,用远程构建运行脚本.做接口的 ...