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锁对象的更多相关文章

  1. Java 学习笔记之 Synchronized锁重入

    Synchronized锁重入: 当一个线程得到一个对象锁后,再次请求此对象锁时是可以再次得到该对象的锁.这也证明在一个Synchronized方法/块的内部调用本类的其他Synchronized方法 ...

  2. Java学习笔记之---类和对象

    Java学习笔记之---类和对象 (一)类 类是一个模板,它描述一类对象的行为和状态  例如:动物类是一个类,动物们都有属性:颜色,动物们都有行为:吃饭 public class Dog { Stri ...

  3. java并发笔记之四synchronized 锁的膨胀过程(锁的升级过程)深入剖析

    警告⚠️:本文耗时很长,先做好心理准备,建议PC端浏览器浏览效果更佳. 本篇我们讲通过大量实例代码及hotspot源码分析偏向锁(批量重偏向.批量撤销).轻量级锁.重量级锁及锁的膨胀过程(也就是锁的升 ...

  4. 2.3多线程(java学习笔记)synchronized关键字

    一.为什么要用synchronized关键字 首先多线程中多个线程运行面临共享数据同步的问题. 多线程正常使用共享数据时需要经过以下步骤: 1.线程A从共享数据区中复制出数据副本,然后处理. 2.线程 ...

  5. Java学习笔记五 常用API对象一

    常用API:字符串操作:String类,StringBuffer类,StringBulider类 字符串是最重要的数据类型之一,处理字符串也是一种语言的基本工作. 1.String类: public ...

  6. Java学习笔记(2)--- 对象和类入门,java包,this 和 super区别

    1.对象和类(Object and class): 一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作. 面对对象编程是java非常重要的一部分,作者本身之前学过c ...

  7. [core java学习笔记][第四章对象与类]

    4.3 用户自定义类 4.3.1 类数组的声明 需要两次new Employee[]=staff=new Employedd[3]; staff[0]=new Employedd(参数列表); sta ...

  8. Java 学习笔记 使用synchronized实现生产者消费者模式

    说明 Object.wait()使当前的线程进入到等待状态(进入到等待队列) Object.notifyAll() 唤醒等待中的全部线程 Object.notify() 随机唤醒一个线程 代码 con ...

  9. Java学习笔记9(面象对象9:多态)

    多态概述 多态是继封装.继承后,面对对象的第三大特性. 现实事物经常会出现多态,如学生,学生是人的一种,则一个具体的同学张三既是学生也是人,即出现两种形态. Java作为面向对象的语言,同样可以描述一 ...

随机推荐

  1. B-xor_2019牛客暑期多校训练营(第四场)

    题意 给出n个数组(每组数个数不定),m个询问 l, r, x 序号在区间\([l,r]\)的每个数组是否都可以取出任意个数异或出x 题解 判断一个数组能否异或出x,是简单的线性基问题 判断多个线性基 ...

  2. Codeforces Round #383 (Div. 2)D. Arpa's weak amphitheater and Mehrdad's valuable Hoses(dp背包+并查集)

    题目链接 :http://codeforces.com/contest/742/problem/D 题意:给你n个女人的信息重量w和美丽度b,再给你m个关系,要求邀请的女人总重量不超过w 而且如果邀请 ...

  3. 徐州邀请赛 江苏 icpc I. T-shirt 矩阵快速幂

    题目 题目描述 JSZKC is going to spend his vacation! His vacation has N days. Each day, he can choose a T-s ...

  4. CodeForces 103 D Time to Raid Cowavans

    Time to Raid Cowavans 题意:一共有n头牛, 每头牛有一个重量,m次询问, 每次询问有a,b 求出 a,a+b,a+2b的牛的重量和. 题解:对于m次询问,b>sqrt(n) ...

  5. c++11特性学习总结

    ubuntu 16.04 自带gcc 5.4 支持c++11 ubuntu 18.04 自带gcc 7.3 支持c++14 查看编译器支持: c++11 c++14 c++17 c++11 featu ...

  6. Mysql的两种存储引擎以及区别

    一.Mysql的两种存储引擎 1.MyISAM: ①不支持事务,但是整个操作是原子性的(事务具备四种特性:原子性.一致性.隔离性.持久性) ②不支持外键,支持表锁,每次所住的是整张表     MyIS ...

  7. 使用Python SMTP发送邮件

    import smtplibfrom email.mime.text import MIMEText # 服务器SMPTserver = "smtp.163.com"# 发送邮件的 ...

  8. 代码整洁 vs 代码肮脏

    写出整洁的代码,是每个程序员的追求.<clean code>指出,要想写出好的代码,首先得知道什么是肮脏代码.什么是整洁代码:然后通过大量的刻意练习,才能真正写出整洁的代码. WTF/mi ...

  9. puttdy连接服务器报错No supported authentication methods available (server sent:publickey,gassapi-keyex,gassapi-with-mic)

    No supported authentication methods available (server sent:publickey,gassapi-keyex,gassapi-with-mic) ...

  10. pageable多字段排序问题

    Sort sort = new Sort(Sort.Direction.DESC, "createdate") .and(new Sort(Sort.Direction.AES, ...