Java 学习笔记之 Synchronized锁对象
Synchronized锁对象:
Synchronized取得的锁都是对象锁,而不是把一段代码或方法当作锁,哪个线程执行带synchronized关键字的方法,哪个线程就持有该方法所属对象的锁,那么其他线程只能等待,前提是多个线程访问的是同一个对象。
实验得出以下结论:
- A线程先持有object对象的Lock锁,B线程可以以异步的方式调用object对象中的非synchronized类型的方法。
public class Sync1Object {
synchronized public void methodA() {
try {
System.out.println("begin methodA threadName = "
+ Thread.currentThread().getName());
Thread.sleep(5000);
System.out.println("A end endTime = " + System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void methodB() {
try {
System.out.println("begin methodB threadName = "
+ Thread.currentThread().getName() + " begin time = "
+ System.currentTimeMillis());
Thread.sleep(3000);
System.out.println("B end");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class Sync1ThreadA extends Thread{
private Sync1Object object;
public Sync1ThreadA(Sync1Object object) {
this.object = object;
}
@Override
public void run() {
super.run();
object.methodA();
}
}
public class Sync1ThreadB extends Thread{
private Sync1Object object;
public Sync1ThreadB(Sync1Object object) {
this.object = object;
}
@Override
public void run() {
super.run();
object.methodB();
}
}
public class ThreadRunMain {
public static void main(String[] args) {
testSync1Thread();
}
public static void testSync1Thread(){
try {
Sync1Object object = new Sync1Object();
Sync1ThreadA a = new Sync1ThreadA(object);
a.setName("A");
a.start();
Thread.sleep(100);
Sync1ThreadB b = new Sync1ThreadB(object);
b.setName("B");
b.start();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
运行结果:

- A线程先持有object对象的Lock锁,B线程如果在这个时候调用object对象中的synchronized类型的方法则需要等待,同步串行执行。
public class Sync1Object {
synchronized public void methodA() {
try {
System.out.println("begin methodA threadName = "
+ Thread.currentThread().getName());
Thread.sleep(5000);
System.out.println("A end endTime = " + System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized public void methodB() {
try {
System.out.println("begin methodB threadName = "
+ Thread.currentThread().getName() + " begin time = "
+ System.currentTimeMillis());
Thread.sleep(3000);
System.out.println("B end");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class Sync1ThreadA extends Thread{
private Sync1Object object;
public Sync1ThreadA(Sync1Object object) {
this.object = object;
}
@Override
public void run() {
super.run();
object.methodA();
}
}
public class Sync1ThreadB extends Thread{
private Sync1Object object;
public Sync1ThreadB(Sync1Object object) {
this.object = object;
}
@Override
public void run() {
super.run();
object.methodB();
}
}
public class ThreadRunMain {
public static void main(String[] args) {
testSync1Thread();
}
public static void testSync1Thread(){
try {
Sync1Object object = new Sync1Object();
Sync1ThreadA a = new Sync1ThreadA(object);
a.setName("A");
a.start();
Thread.sleep(100);
Sync1ThreadB b = new Sync1ThreadB(object);
b.setName("B");
b.start();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
运行结果:

Java 学习笔记之 Synchronized锁对象的更多相关文章
- Java 学习笔记之 Synchronized锁重入
Synchronized锁重入: 当一个线程得到一个对象锁后,再次请求此对象锁时是可以再次得到该对象的锁.这也证明在一个Synchronized方法/块的内部调用本类的其他Synchronized方法 ...
- Java学习笔记之---类和对象
Java学习笔记之---类和对象 (一)类 类是一个模板,它描述一类对象的行为和状态 例如:动物类是一个类,动物们都有属性:颜色,动物们都有行为:吃饭 public class Dog { Stri ...
- java并发笔记之四synchronized 锁的膨胀过程(锁的升级过程)深入剖析
警告⚠️:本文耗时很长,先做好心理准备,建议PC端浏览器浏览效果更佳. 本篇我们讲通过大量实例代码及hotspot源码分析偏向锁(批量重偏向.批量撤销).轻量级锁.重量级锁及锁的膨胀过程(也就是锁的升 ...
- 2.3多线程(java学习笔记)synchronized关键字
一.为什么要用synchronized关键字 首先多线程中多个线程运行面临共享数据同步的问题. 多线程正常使用共享数据时需要经过以下步骤: 1.线程A从共享数据区中复制出数据副本,然后处理. 2.线程 ...
- Java学习笔记五 常用API对象一
常用API:字符串操作:String类,StringBuffer类,StringBulider类 字符串是最重要的数据类型之一,处理字符串也是一种语言的基本工作. 1.String类: public ...
- Java学习笔记(2)--- 对象和类入门,java包,this 和 super区别
1.对象和类(Object and class): 一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作. 面对对象编程是java非常重要的一部分,作者本身之前学过c ...
- [core java学习笔记][第四章对象与类]
4.3 用户自定义类 4.3.1 类数组的声明 需要两次new Employee[]=staff=new Employedd[3]; staff[0]=new Employedd(参数列表); sta ...
- Java 学习笔记 使用synchronized实现生产者消费者模式
说明 Object.wait()使当前的线程进入到等待状态(进入到等待队列) Object.notifyAll() 唤醒等待中的全部线程 Object.notify() 随机唤醒一个线程 代码 con ...
- Java学习笔记9(面象对象9:多态)
多态概述 多态是继封装.继承后,面对对象的第三大特性. 现实事物经常会出现多态,如学生,学生是人的一种,则一个具体的同学张三既是学生也是人,即出现两种形态. Java作为面向对象的语言,同样可以描述一 ...
随机推荐
- Luogu-P1027 Car的旅行路线 已知三点确定矩形 + 最短路
传送门:https://www.luogu.org/problemnew/show/P1027 题意: 图中有n个城市,每个城市有4个机场在矩形的四个顶点上.一个城市间的机场可以通过高铁通达,不同城市 ...
- ZOJ - 3870-Team Formation二进制,位运算
传送门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3870 题意:找出一个数列中的两个数,所有通过异或和使得结果同时大于 ...
- Heron and His Triangle 2017 沈阳区域赛
A triangle is a Heron’s triangle if it satisfies that the side lengths of it are consecutive integer ...
- SpringMVC的工作原理图
SpringMVC的工作原理图: SpringMVC流程 1. 用户发送请求至前端控制器DispatcherServlet. 2. DispatcherServlet收到请求调用HandlerMa ...
- Maven学习归纳(一)——简单的环境配置入门
一.Maven的基本概念 Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的编译,测试,构建,报告和文档的软件项目管理工具和解决依赖关系的工具. 1.1 项目的构建 项目的构建 ...
- 代码整洁 vs 代码肮脏
写出整洁的代码,是每个程序员的追求.<clean code>指出,要想写出好的代码,首先得知道什么是肮脏代码.什么是整洁代码:然后通过大量的刻意练习,才能真正写出整洁的代码. WTF/mi ...
- eos bp节点 超级节点搭建
搭建eos BP节点 环境搭建与配置 安装最新版本 $ wget https://github.com/eosio/eos/releases/download/v1.8.1/eosio-1 ...
- FJUT2019暑假周赛三部分题解
A本来想改到q<1e5,让你们预处理的,然后想了哈作为个逆元模板题吧= =,做不出来自行反思. B贴个题面 因为只有一次机会,那么也就是两点分布期望E = p了,先说说大家的做法,先求出每个n的 ...
- charles 镜像工具
本文参考:charles 镜像工具 镜像工具会在你浏览指定网站时,把抓取到的文件克隆一份,并保存在你指定的路径下: 注意:如果你配置是www.aaa.com; 那么只会抓这个域名下的文件,这个域名如果 ...
- 个人微信Hook-C#Demo开发SDK
目录 基础信息类 好友操作 群操作类 发送信息 接收信息 Demo源码 基础信息类 获取个人信息 从网络获取群成员信息 从网络获取个人信息 获取公众号信息 获取群组信息 获取群成员信息 获取单个好友信 ...