Java多线程之synchronized关键字的使用
作者:Fe_lin 发布时间:2023-12-12 21:46:16
标签:Java,synchronized,关键字
一、使用在非静态方法上
public synchronized void syzDemo(){
System.out.println(System.currentTimeMillis());
System.out.println("进入synchronized锁:syzDemo");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
二、使用在静态方法上
public synchronized static void syzDemo1(){
System.out.println(System.currentTimeMillis());
System.out.println("进入synchronized锁:syzDemo1");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
三、使用在代码块上
public synchronized void syzDemo2(){
synchronized (this){
System.out.println(System.currentTimeMillis());
System.out.println("进入synchronized锁:syzDemo2");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public synchronized void syzDemo3(){
synchronized (ExcelUtil.class){
System.out.println(System.currentTimeMillis());
System.out.println("进入synchronized锁:syzDemo3");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
四、三种方式的区别
public static void main(String[] args) {
SyzDemo syzDemo = new SyzDemo();
SyzDemo syzDemo1 = new SyzDemo();
Thread thread = new Thread(()->{
syzDemo.syzDemo();
});
thread.start();
Thread thread1 = new Thread(()->{
syzDemo1.syzDemo();
});
thread1.start();
}
4.1 不会互斥
public static void main(String[] args) {
SyzDemo syzDemo = new SyzDemo();
SyzDemo syzDemo1 = new SyzDemo();
Thread thread = new Thread(()->{
syzDemo.syzDemo();
});
thread.start();
Thread thread1 = new Thread(()->{
syzDemo.syzDemo();
});
thread1.start();
}
4.2 互斥
public static void main(String[] args) {
SyzDemo syzDemo = new SyzDemo();
SyzDemo syzDemo1 = new SyzDemo();
Thread thread = new Thread(()->{
syzDemo.syzDemo1();
});
thread.start();
Thread thread1 = new Thread(()->{
syzDemo1.syzDemo1();
});
thread1.start();
}
解析:
在图1中thread1和thread分别调用syzDemo和syzDemo1对象中的syzDemo方法,因为两个线程调用是不同的对象的两个方法,所以不会互斥
在图2中thread1和thread都在调用syzDemo对象中的syzDemo方法,因为syzDemo方法加了synchronized
在图3中thread1和thread分别调用syzDemo和syzDemo1对象中的syzDemo1方法,但是因为syzDemo1方法属于静态方法,在类加载时就会加载到方法区,所以本质上两个线程都在调用同一个方法,于是产生了互斥
syzDemo2中与syzDemo相同:锁定的是当前实例的这一段代码,只有多个线程中调用的是同一个实例且执行到这一段代码时才会互斥,syzDemo3于syzDemo1相同:锁定的是当前类的这一段代码,只要多个线程共同执行这一段代码就会产生互斥
来源:https://blog.csdn.net/Fe_lin/article/details/116200049


猜你喜欢
- 本篇我们讲解下使用spring创建bean的几种方式,创建bean,也可以叫组件注册,就是把单例bean放到spring容器中。我们定义如下
- 本文实例讲述了简单记事本java实现代码。分享给大家供大家参考。具体如下:完整代码如下:import java.awt.*;import j
- 什么是RecyclerView关于RecyclerView,是一个主要用于展示和回收View的有一个控件,在官用了一句话来概括Recycle
- 开篇Mybatis有个实用的功能就是逆向工程,能根据表结构反向生成实体类,这样能避免手工生成出错。市面上的教程大多都很老了,大部分都是针对m
- 嵌套表格,即在一张表格中的特定单元格中再插入一个或者多个表格,使用嵌套表格的优点在于能够让内容的布局更加合理,同时也方便程序套用。下面的示例
- 大多数情况下你不需要访问者模式,但当一旦需要访问者模式时,那就是真的需要它了,这是设计模式创始人的原话。可以看出应用场景比较少,但需要它的时
- 数组翻转的方法(java实现),数组翻转,就是将数组倒置,例如原数组为:{"a","b","
- 前言:在Java8支持Lambda表达式以后,为了满足Lambda表达式的一些典型使用场景,JDK为我们提供了大量常用的函数式接口。它们主要
- 一、项目运行环境配置:Jdk1.8 + Tomcat8.5 + mysql + Eclispe(IntelliJ IDEA,Eclispe,
- 本文实例为大家分享了Java从服务端下载Excel模板文件的具体实现代码,供大家参考,具体内容如下方法一 (2021年01月更新)生成exc
- 本文实例讲述了Java实现的简单网页截屏功能。分享给大家供大家参考,具体如下:package awtDemo;import java.awt
- 本人是从事互联网金融行业的,所以会接触到一些金融类的问题,常见的一种就是数字转汉字大小写的问题。所以抽空就写了一个小小的工具类,实现了数字转
- 本文实现了一个有趣的小东西:使用自定义View绘图,一边画线,画出的线条渐渐变淡,直到消失。效果如下图所示:用属性动画或者渐变填充(Shad
- 一.相关知识:Java多线程程序设计到的知识:(一)对同一个数量进行操作(二)对同一个对象进行操作(三)回调方法使用(四)线程同步,死锁问题
- 前面介绍了Spring Boot 整合mybatis 使用注解的方式实现数据库操作,介绍了如何自动生成注解版的mapper 和pojo类。
- 本文实例讲述了Android编程实现屏幕禁止休眠的方法。分享给大家供大家参考,具体如下:实现这一功能的方法有两种,一种是在Manifest.
- 项目需要从其他网站获取数据,因为是临时加的需求,在开始项目时没想到需要多数据源于是百度了一下,发现只需要改动一下Spring 的applic
- 最近有一个项目要用到年份周期,用于数据统计图表展示使用,当中用到年份周期,以及年份周期所在的日期范围。当初设想通过已知数据来换算年份周期,经
- IntelliJ IDEA简称IDEA,是常用的java开发工具,相对eclipse在使用上入门较难,但在编写java代码方面比较eclip
- 1、什么是过滤器?在客户端到服务器的过程中,当发送请求时,如果有不符合的信息将会被filter进行拦截,如果符合则会进行放行,在服务器给客户