synchronized锁的内容

import java.util.concurrent.TimeUnit;

class Test1 {

    public static void main(String[] args) {
Phone phone = new Phone(); new Thread(() -> {
phone.sendMsg();
}, "A").start(); try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
} new Thread(() -> {
phone.call();
}, "B").start(); }
} class Phone { // 锁的是方法的调用者
// 用的是同一个锁,谁先拿到谁执行
public synchronized void sendMsg() {
try {
TimeUnit.SECONDS.sleep(4);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("发短信");
} public synchronized void call() {
System.out.println("打电话");
}
}
import java.util.concurrent.TimeUnit;

class Test2 {
public static void main(String[] args) {
// 一个对象只有一把锁
Phone2 phone = new Phone2(); new Thread(() -> {
phone.sendMsg();
}, "A").start(); try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
} new Thread(() -> {
phone.hello();
}, "B").start(); // 先hello后发短信
}
} class Phone2 {
// 锁的是方法的调用者
// 用的是同一个锁,谁先拿到谁执行
public synchronized void sendMsg() {
try {
TimeUnit.SECONDS.sleep(4);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("发短信");
} public synchronized void call() {
System.out.println("打电话");
} // 没有锁,不是同步方法,不受锁的影响
public void hello() {
System.out.println("hello");
}
}
import java.util.concurrent.TimeUnit;

class Test3 {
public static void main(String[] args) {
// 一个对象只有一把锁
// 两个对象的Class类模板只有一个,static锁的是class
Phone3 phone1 = new Phone3();
Phone3 phone2 = new Phone3(); new Thread(() -> {
phone1.sendMsg();
}, "A").start(); try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
} new Thread(() -> {
phone2.call();
}, "B").start(); // 先短信后打电话
}
} // 两个静态的锁
// 类一加载就有了,锁的是Class
class Phone3 {
public static synchronized void sendMsg() {
try {
TimeUnit.SECONDS.sleep(4);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("发短信");
} public static synchronized void call() {
System.out.println("打电话");
} }
import java.util.concurrent.TimeUnit;

class Test4 {
public static void main(String[] args) {
// 一个对象只有一把锁
// 两个对象的Class类模板只有一个,static锁的是class
Phone4 phone1 = new Phone4();
Phone4 phone2 = new Phone4(); new Thread(() -> {
phone1.sendMsg();
}, "A").start(); try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
} new Thread(() -> {
phone2.call();
}, "B").start(); // 先打电话后发短信
}
} class Phone4 { // 锁的是Class
public static synchronized void sendMsg() {
try {
TimeUnit.SECONDS.sleep(4);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("发短信");
} // 普通同步方法 锁的是调用者
public synchronized void call() {
System.out.println("打电话");
} }

synchronized锁的内容的更多相关文章

  1. Java多线程6:Synchronized锁代码块(this和任意对象)

    一.Synchronized(this)锁代码块 用关键字synchronized修饰方法在有些情况下是有弊端的,若是执行该方法所需的时间比较长,线程1执行该方法的时候,线程2就必须等待.这种情况下就 ...

  2. 015-线程同步-synchronized几种加锁方式、Java对象头和Monitor、Mutex Lock、JDK1.6对synchronized锁的优化实现

    一.synchronized概述基本使用 为确保共享变量不会出现并发问题,通常会对修改共享变量的代码块用synchronized加锁,确保同一时刻只有一个线程在修改共享变量,从而避免并发问题. syn ...

  3. java的多线程安全,ReentrantLock与synchronized锁

    前言 多线程总的来说是一个很大的模块,所以虽然之前就想写但一直感觉有地方没有理解透,在经过了一段时间学习后,终于有点感觉了,在此写下随笔. 多线程安全问题##: 首先和大家讨论一下多线程为什么会不安全 ...

  4. 【从刷面试题到构建知识体系】Java底层-synchronized锁-1

    在技术论坛中,经常看到一种言论:面试造火箭,干活拧螺丝.我们平时写的大部分代码的确是CRDU,再提一个层次,也无非就是揉进去复杂一些的业务逻辑,把一堆的CRDU组合起来. 那么问题来了:我们提倡的研究 ...

  5. 【从刷面试题到构建知识体系】Java底层-synchronized锁-2偏向锁篇

    上一篇通过构建金字塔结构,来从不同的角度,由浅入深的对synchronized关键字做了介绍, 快速跳转:https://www.cnblogs.com/xyang/p/11631866.html 本 ...

  6. Java性能之synchronized锁的优化

    synchronized / Lock 1.JDK 1.5之前,Java通过synchronized关键字来实现锁功能 synchronized是JVM实现的内置锁,锁的获取和释放都是由JVM隐式实现 ...

  7. synchronized锁机制的实现原理

    Synchronized 锁机制的实现原理 Synchronized是Java种用于进行同步的关键字,synchronized的底层使用的是锁机制实现的同步.在Java中的每一个对象都可以作为锁. J ...

  8. 【大厂面试07期】说一说你对synchronized锁的理解?

    synchronized锁的原理也是大厂面试中经常会涉及的问题,本文主要通过对以下问题进行分析讲解,来帮助大家理解synchronized锁的原理. 1.synchronized锁是什么?锁的对象是什 ...

  9. 并发编程之synchronized锁(一)

    一.设计同步器的意义 多线程编程中,有可能会出现多个线程同时访问同一个共享.可变资源的情况,这个资源我们称之其为临界资源:这种资源可能是:对象.变量.文件等. 共享:资源可以由多个线程同时访问 可变: ...

  10. Lock、Synchronized锁区别解析

    上篇博文在讲解 ConcurrentHashMap 时说到 1.7 中 put 方法实现同步的方式是使用继承了 ReentrantLock 类的 segment 内部类调用 lock 方法实现的,而在 ...

随机推荐

  1. 【转载】 图解协程调度模型-GMP模型

    原文地址: https://www.cnblogs.com/codexiaoyi/p/14975236.html =========================================== ...

  2. 如何在X86_64系统上运行arm架构的docker容器——(异构/不同架构)CPU下的容器启动

    近期使用华为的人工智能集群,其中不仅要求异构加速端需要使用昇腾的硬件,更是要求CPU是arm架构的,因此就导致在本地x86电脑上难以对云端的arm版本的镜像进行软件安装和打包操作,为此我们需要在x86 ...

  3. 【转载】解决Nvidia-smi没有进程但是显存不释放的问题

    ----------------版权声明:本文为CSDN博主「打拳的土豆」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn ...

  4. baselines算法库common/vec_env/util.py模块分析

    util.py模块代码: """ Helpers for dealing with vectorized environments. """ ...

  5. 键盘中上、下、左、右四个光标键所对应的ASCII码值为多少

    首先给出ASCII码值表: 上.下.左.右这四个光标键对应的ASCII码值不是一个值而是三个,准确的说光标键的ASCII码值是一个组合. 每个方向键所对应的三个键值为:0x1b + 0x5b + n ...

  6. 给我5分钟,保证教会你在vue3中动态加载远程组件

    前言 在一些特殊的场景中(比如低代码.减少小程序包体积.类似于APP的热更新),我们需要从服务端动态加载.vue文件,然后将动态加载的远程vue组件渲染到我们的项目中.今天这篇文章我将带你学会,在vu ...

  7. 你还在手动操作仓库?这款 CLI 工具让你效率飙升300%!

    前言 作为一名开发者,我经常会在 GitHub 和 Gitee 上 fork 各种项目.时间一长,这些仓库就会堆积如山,变成了"垃圾仓库".每次打开代码托管平台,看到那些不再需要的 ...

  8. 如何让你的C语言程序打印的log多一点色彩?(超级实用)

    接着上一篇文章<由字节对齐引发的一场"血案" > 在平常的调试中,printf字体格式与颜色都是默认一致的. 如果可以根据log信息的重要程度,配以不同的颜色与格式,可 ...

  9. Blazor开发框架Known-V2.0.9

    V2.0.9 Known是基于Blazor的企业级快速开发框架,低代码,跨平台,开箱即用,一处代码,多处运行.本次版本主要是修复一些BUG和表格页面功能增强. 官网:http://known.puma ...

  10. Java取模和取余,你真的弄懂了吗?

    前言 Java 中常见的取模和取余(求余)计算,在我们日常的很多业务领域都有用到.比如当我们做数据加密时,密码学中不同的加密方案底层会采用不同的模运算来决定其复杂度:做游戏的同学游戏引擎中的取余求最高 ...