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. 江苏 徐州邀请赛 icpc B Array dp 滚动数组模板

    题目 题目描述 JSZKC is the captain of the lala team. There are N girls in the lala team. And their height ...

  2. codeforces 572 D. Minimization(dp+ 思维)

    题目链接:http://codeforces.com/contest/572/problem/D 题意:给出一个序列,可以任意调整序列的顺序,使得给出的式子的值最小 题解:显然要先排一下序,然后取相邻 ...

  3. CH4301 Can you answer on these queries III 题解

    给定长度为N的数列A,以及M条指令 (N≤500000, M≤100000),每条指令可能是以下两种之一: "2 x y",把 A[x] 改成 y. "1 x y&quo ...

  4. Educational Codeforces Round 69 (Rated for Div. 2)

                                                                                                  A. DIY ...

  5. 详细的漏洞复现:Shellshock CVE-2014-6271 CVE-2014-7169

    目录 前言 漏洞原理 利用方式 复现过程 1. 环境准备 (1) 为容器配置固定IP地址 (2) 查看bash版本 2. 本地验证:测试镜像系统是否存在漏洞 3. 远程模拟验证(原理验证) (1) 查 ...

  6. spring boot监听器的实现

    spring boot监听器的实现 如下所示: import javax.servlet.ServletContextEvent; import javax.servlet.ServletContex ...

  7. sql 行列互转

    1.行转列 现有数据: 期望数据: 1.1建表建数据 IF OBJECT_ID('temp_20170701','u') IS NOT NULL DROP TABLE temp_20170701 CR ...

  8. 新书推荐《再也不踩坑的Kubernetes实战指南》

      <再也不踩坑的Kubernetes实战指南>终于出版啦.目前可以在京东.天猫购买,京东自营和当当网预计一个星期左右上架. 本书贴合生产环境经验,解决在初次使用或者是构建集群中的痛点,帮 ...

  9. android 定时提醒 - Notification

    定时弹出 demo ,代码如下: 1.MainActivity.java public class MainActivity extends Activity implements OnClickLi ...

  10. php异或计算绕过preg_match()

    原理以制作免杀马为例:     在制作免杀马的过程,根据php的语言特性对字符进行!运算会将字符类型转为bool类型,而bool类型遇到运算符号时,true会自动转为数字1,false会自动转为数字0 ...