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作为面向对象的语言,同样可以描述一 ...
随机推荐
- HDU-3478Catch二分图的否命题
HDU-3478Catch 题意:考虑Thief能否: 由于我推着推着就想到必须要三点可以互通,和二分图的结论正好相反,所以就试了一发, 真没想到thief的初始位置是不用考虑的. 下面是ac代码: ...
- 牛客小白赛4 A 三角形 数学
链接:https://www.nowcoder.com/acm/contest/134/A来源:牛客网 题目描述 铁子从森林里收集了n根木棍,她开始将它们按顺序的排成一排,从左到右依次为1到n,她回想 ...
- CQ18阶梯赛第二场
H国的身份证号码I HihoCoder - 1558 只要单纯的判断一下前后的乘积就好了, 因为不是很想处理倍数的关系, 所以我这里是用 string去处理. 代码: #include<bits ...
- java hdu A+B for Input-Output Practice (IV)
A+B for Input-Output Practice (IV) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/327 ...
- 关闭Linux(Ubuntu)错误报告
关于错误报告 网上查了下,Ubuntu(包括elementary,elementary是基于Ubuntu的)桌面版预装了Apport,它是一个错误收集系统,会收集软件崩溃.未处理异常和其他,包括程序b ...
- WS的发布与调用
WebService—CXF整合Spring实现接口发布和调用过程 https://www.cnblogs.com/domi22/p/8094517.html spring 集成cxf 第二弹( ...
- Go操作kafka
Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据,具有高性能.持久化.多副本备份.横向扩展等特点.本文介绍了如何使用Go语言发送和接收kafka消息. s ...
- Python函数编程——闭包和装饰器
Python函数编程--闭包和装饰器 一.闭包 关于闭包,即函数定义和函数表达式位于另一个函数的函数体内(嵌套函数).而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量.参数.当其中一个 ...
- Eclipse For Mac下中文乱码解决
在Mac os 版本的eclipse下引入java项目或是源代码,经常会碰到其中中文部分都是乱码.对于这一问题,经过小试,可以解决. 1.打开eclipse 偏好设置 2.General ——> ...
- Python集训营45天—Day04 (函数)
目录 1. 函数介绍 2. 函数的参数 3. 模块与函数 4. 递归函数 5. 匿名函数 6. 多返回值 python 的学习已经进入到第四天,前面几章我们已经学会了基本的变量操作,以及分支结构和循环 ...