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三种使用方式,及锁的类型验证的更多相关文章

  1. 并发编程系列小结(线程安全,synchronized,脏读,线程间的通信wait/notify,线程的三种实现方式Demo,可替代wait/notify的方法)

    线程安全: 当多个线程访问某一个类(对象或方法)时,这个类始终都能表现出正确的行为,那么这个类(对象或方法就是线程安全的) synchronized: 可以在任意对象或方法上加锁,而加锁的这段代码称为 ...

  2. 分布式锁的三种实现方式 数据库、redis、zookeeper

    版权声明: https://blog.csdn.net/wuzhiwei549/article/details/80692278 一.为什么要使用分布式锁 我们在开发应用的时候,如果需要对某一个共享变 ...

  3. Java之线程安全中的三种同步方式

    一个程序在运行起来时,会转换为进程,通常含有多个线程. 通常情况下,一个进程中的比较耗时的操作(如长循环.文件上传下载.网络资源获取等),往往会采用多线程来解决. 比如,现实生活中,银行取钱问题.火车 ...

  4. 【重学Java】多线程基础(三种创建方式,线程安全,生产者消费者)

    实现多线程 简单了解多线程[理解] 是指从软件或者硬件上实现多个线程并发执行的技术. 具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程,提升性能. 并发和并行[理解] 并行:在同一时刻, ...

  5. 通过三个DEMO学会SignalR的三种实现方式

    一.理解SignalR ASP .NET SignalR 是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信(即:客户端(Web页面)和服务器端可以互相实时的通知消息 ...

  6. Hive metastore三种配置方式

    http://blog.csdn.net/reesun/article/details/8556078 Hive的meta数据支持以下三种存储方式,其中两种属于本地存储,一种为远端存储.远端存储比较适 ...

  7. django 模板语法和三种返回方式

    模板 for循环 {% for athlete in athlete_list %} <li>{{ athlete.name }}</li> {% endfor %} if语句 ...

  8. js的三种继承方式及其优缺点

    [转] 第一种,prototype的方式: //父类 function person(){ this.hair = 'black'; this.eye = 'black'; this.skin = ' ...

  9. spring ioc三种注入方式

    spring ioc三种注入方式 IOC ,全称 (Inverse Of Control) ,中文意思为:控制反转 什么是控制反转? 控制反转是一种将组件依赖关系的创建和管理置于程序外部的技术. 由容 ...

随机推荐

  1. Delphi 通过ADO连接数据库

  2. (十二)Linux Kernel suspend and resume

    一.对于休眠(suspend)的简单介绍   在Linux中,休眠主要分三个主要的步骤:   1) 冻结用户态进程和内核态任务   2) 调用注册的设备的suspend的回调函数, 顺序是按照注册顺序 ...

  3. angular流程引擎集成

    工作流在oa和erp中十分常见,现有成熟的工作流通常是在客户端实现的,web实现工作流的案例十分稀少.要实现web工作流必须要有强大的流程设计器,这里为大家介绍一款基于angular的流程控件,其功能 ...

  4. 【转载】Attention Mechanism in Deep Learning

    本篇随笔为转载,原文地址:知乎,深度学习中Attention Mechanism详细介绍:原理.分类及应用.参考链接:深度学习中的注意力机制. Attention是一种用于提升基于RNN(LSTM或G ...

  5. js实现购物车数量的增加与减少,js实现购物车数量的自增与自减

    js实现购物车数量的增加与减少,js实现购物车数量的自增与自减 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//E ...

  6. Python Module模块

    模块 https://docs.python.org/zh-cn/3/tutorial/modules.html 模块的概念被高级语言广泛使用. Python的定义 一个包括Python定义和语句的文 ...

  7. Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: org/dom4j/io/SAXReader

    Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: org/dom4j/io/SAXReader ...

  8. pycharm图像不能显示,之前是可以显示的。显示一两次突然不显示了

    网上说是什么包问题的就说了.我遇到一个非常奇葩的问题 因为你的设置可能是这样 每次都在窗口右侧的工具栏那边显示.可能突然心情不佳就不显示了.然后你再把勾去掉即可.你要喜欢再点上也行.

  9. Struct2的简单的CRUD配置和使用

    1. 首先是Struct2使用的jar包,可以在官网下载https://struts.apache.org/   ,其中包只要下面这些就够用了. 或者点击下面链接下载 链接:https://pan.b ...

  10. guava的一些用法

    package guavaTest; import com.google.common.base.CharMatcher; import com.google.common.base.Joiner; ...