1. 对象上有关键字
package com.study.juc.sync;

import java.util.concurrent.TimeUnit;

public class Test1 {

    public static void main(String[] args) throws InterruptedException {
Phone phone = new Phone();
Thread t1= new Thread(()->{
try {
phone.sendSms();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
},"A");
t1.start(); TimeUnit.SECONDS.sleep(1); Thread t2=new Thread(()->{
phone.call();
},"B"); t2.start(); Thread t3=new Thread(()->{
phone.hello();
},"c"); t3.start();
} } class Phone{ public synchronized void call(){
System.out.println("打电话");
} public synchronized void sendSms() throws InterruptedException {
TimeUnit.SECONDS.sleep(4);
System.out.println("发短信");
} public void hello(){
System.out.println("hello ");
}
}

请输出上面例子的结果。

  • 结论

    如果时同一个对象上,加 synchronized 那么这个对象的一个方法先进入,另外的方法只能等待,需要登台获取锁的对象完成才能执行。

    如果方法上没有锁,那么不会等待。
  1. 两个对象的调用
package com.study.juc.sync;

import java.util.concurrent.TimeUnit;

public class Test2 {

    public static void main(String[] args) throws InterruptedException {
Phone2 phone1 = new Phone2();
Phone2 phone2 = new Phone2();
Thread t1= new Thread(()->{
try {
phone1.sendSms();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
},"A");
t1.start(); TimeUnit.SECONDS.sleep(1); Thread t2=new Thread(()->{
phone2.call();
},"B"); t2.start(); } } class Phone2{ public synchronized void call(){
System.out.println("打电话");
} public synchronized void sendSms() throws InterruptedException {
TimeUnit.SECONDS.sleep(4);
System.out.println("发短信");
} public void hello(){
System.out.println("hello ");
}
}

创建两个对象,分别调用其方法,由于是两个对象,锁的作用范围也是对象,因此两个对象的锁不互相干扰。

  1. 静态方法
package com.study.juc.sync;

import java.util.concurrent.TimeUnit;

public class Test3 {

    public static void main(String[] args) throws InterruptedException {

        Phone3 phone1 = new Phone3();
Phone3 phone2 = new Phone3();
Thread t1= new Thread(()->{
try {
phone1.sendSms();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
},"A");
t1.start(); TimeUnit.SECONDS.sleep(1); Thread t2=new Thread(()->{
phone2.call();
},"B"); t2.start();
}
} class Phone3{ public static synchronized void call(){
System.out.println("打电话");
} public static synchronized void sendSms() throws InterruptedException {
TimeUnit.SECONDS.sleep(4);
System.out.println("发短信");
} }

synchronized 作用在 class 上,所以锁的对象是 class。

  1. 一个实例方法,一个类方法
package com.study.juc.sync;

import java.util.concurrent.TimeUnit;

public class Test4 {

    public static void main(String[] args) throws InterruptedException {

        Phone4 phone = new Phone4();
Thread t1= new Thread(()->{
try {
phone.sendSms();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
},"A");
t1.start(); TimeUnit.SECONDS.sleep(1); Thread t2=new Thread(()->{
phone.call();
},"B"); t2.start(); } } class Phone4{ public synchronized void call(){
System.out.println("打电话");
} public static synchronized void sendSms() throws InterruptedException {
TimeUnit.SECONDS.sleep(4);
System.out.println("发短信");
} }

一个调用静态方法,一个调用实例方法,实际是两把锁相互不影响。

synchronized 关键字测试的更多相关文章

  1. java synchronized关键字浅探

    synchronized 是 java 多线程编程中用于使线程之间的操作串行化的关键字.这种措施类似于数据库中使用排他锁实现并发控制,但是有所不同的是,数据库中是对数据对象加锁,而 java 则是对将 ...

  2. 从线程池到synchronized关键字详解

    线程池 BlockingQueue synchronized volatile 前段时间看了一篇关于"一名3年工作经验的程序员应该具备的技能"文章,倍受打击.很多熟悉而又陌生的知识 ...

  3. 并发之synchronized关键字的应用

    并发之synchronized关键字的应用 synchronized关键字理论基础 前两章我们学习了下java内存模型的相关知识, 现在我们来讲讲逢并发必出现的synchronized关键字. 作用 ...

  4. 并发系列(一)-----synchronized关键字

    一 简介 说到并发不得不提的synchronized,synchronized关键字是元老级别的角色.在Java SE 1.6之前synchronized被称为是重量,在1.6之后对同步进行了一系列的 ...

  5. java synchronized关键字浅析

    synchronized这个关键字想必学Java的人都应该知道. 直接上例子: 方法级别实例 public class AtomicInteger { private int index; publi ...

  6. 关于JAVA多线程并发synchronized的测试与合理使用

    在项目开发中, 或许会碰到JAVA的多线程处理, 为保证业务数据的正常, 必须加上锁机制,  常用的处理方法一般是加上synchronized关键字, 目前JDK版本对synchronized已经做了 ...

  7. [java] java synchronized 关键字详解

    Java语言的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码.当两个并发线程访问同一个对象object中的这个加锁同步代码块时,一 ...

  8. 并发编程-synchronized关键字大总结

    0.synchronized 的特点: 可以保证代码的原子性和可见性. 1.synchronized 的性质: 可重入(可以避免死锁.单个线程可以重复拿到某个锁,锁的粒度是线程而不是调用).不可中断( ...

  9. synchronized关键字修饰非静态方法与静态方法的区别

    这里我们先创建ObjLock类,并实现Runnable接口.并创建一个Demo类,具有被synchronized关键字修饰的非静态方法与静态方法. 非静态方法 public class ObjLock ...

  10. java线程总结--synchronized关键字,原理以及相关的锁

    在多线程编程中,synchronized关键字非常常见,当我们需要进行“同步”操作时,我们很多时候需要该该关键字对代码块或者方法进行锁定.被synchronized锁定的代码块,只能同时有一条线程访问 ...

随机推荐

  1. ASP.NET Core Library – CsvHelper

    前言 平常都是用 Excel 的多, 但这一次遇到 Google Ads. 谷歌嘛, 当然不喜欢微软的 Excel. 硬是要求 CSV. 没办法, 只能找 Library 搞一搞了. 参考 Docs ...

  2. SQL Server – 树结构 (二叉树, 红黑树, B-树, B+树)

    前言 很久以前有学习过各种树结构, 但后来真的没有在实际项目中运用到. 毕竟我主要负责的都是写业务代码. 太上层了 但是忘光光还是很可惜的. 所以久久可以复习一下. 记得概念也好, 帮助思考. 参考: ...

  3. CSS – 屏幕, 打印, 分辨率, 物理像素, 逻辑像素, Retina, DPI, PPI 是什么?

    前言 之前就有写过关于 Retina 和 Responsive Image 响应式图片 (responsive image) Retina 显示屏 但写的很烂, 这篇从新整理一下. 参考: 掌握web ...

  4. PyCharm 的一些基本设置&&常用插件&&快捷键

    PyCharm一些基本设置   1.主题色彩   2.添加设置:Ctrl+鼠标滚轮上下调节字体大小           3. 中文语言包   4.翻译插件 5.快捷键

  5. 系统编程-进程-ps命令、进程调度、优先级翻转、进程状态

    1.    ps详解 ps  : 只列出当前用户的进程 ps -ef : e表示有效, f 表示全面, 所以是列出后台的所有有效进程. ps -ef | more :   列出后台所有的有效进程,并且 ...

  6. Vue3——环境变量的配置

    vue3环境变量的配置 开发环境(development) 测试环境(testing) 生产环境(production) 项目根目录分别添加 开发.生产和测试环境的文件! .env.developme ...

  7. 【赵渝强老师】Flink的DataSet算子

    Flink为了能够处理有边界的数据集和无边界的数据集,提供了对应的DataSet API和DataStream API.我们可以开发对应的Java程序或者Scala程序来完成相应的功能.下面举例了一些 ...

  8. PC软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具

    前言 国庆假期各种活动比较多,直到上班才有时间来更新文章~ 不过这两天我还是做了个小玩意(Clipify),起因是想给之前开发来自己用的简单视频剪辑工具 QuickCutSharp 加个功能,不过这个 ...

  9. 托管服务简介IHostedService接口 继承 BackgroundSerice接口

    1. 场景:代码运行在后台,比如服务器启动的时候在后台预先加载数据到缓存,每天凌晨3 点把数据到处到数据库备份,每隔5秒在两张表之间同步一次数据 : 2. 托管服务实现IHoutedService接口 ...

  10. HDU-ACM 2024 Day2

    T1004 a*b problem(HDU 7448) 不会. T1005 小塔的养成游戏之梦(HDU 7449) 不会. T1009 强攻计策(HDU 7453) 容易发现初始速度是多少对答案没有影 ...