Java多线程之synchronized关键字的使用

作者:Fe_lin 时间:2023-12-12 21:46:16 

一、使用在非静态方法上


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

标签:Java,synchronized,关键字
0
投稿

猜你喜欢

  • flutter中的布局和响应式app方法示例

    2023-02-19 19:14:52
  • 在SpringBoot中整合使用Netty框架的详细教程

    2023-03-26 23:59:53
  • 关于C#调用C++dll传指针释放内存问题

    2021-12-20 06:56:34
  • python gstreamer实现视频快进/快退/循环播放功能

    2022-07-06 10:09:20
  • java精度计算代码 java指定精确小数位

    2023-07-31 03:03:58
  • Android ANR原理分析

    2023-02-01 13:11:58
  • 实例详解Android解决按钮重复点击问题

    2023-10-16 09:10:12
  • Hibernate持久化对象生命周期原理解析

    2022-08-14 19:44:27
  • Spring Boot Actuator自定义健康检查教程

    2022-06-12 14:54:59
  • Android onClick方法与setOnClickListener方法对比

    2022-02-09 22:21:40
  • C#实现启动项管理的示例代码

    2022-07-30 09:09:04
  • Spring框架的环境搭建和测试实现

    2023-10-27 17:57:57
  • Java线程池的优点及池化技术的应用

    2022-07-01 08:12:23
  • Android自定义密码输入框和数字键盘

    2022-02-04 11:14:00
  • Java 实战项目之疫情人员流动管理系统详解

    2022-08-04 19:30:57
  • java 动态增加定时任务示例

    2023-07-29 06:56:00
  • Android 官推 kotlin-first 的图片加载库——Coil的使用入门

    2022-07-06 00:53:34
  • Java thread.isInterrupted() 返回值不确定结果分析解决

    2023-11-09 19:27:09
  • Android系列---JSON数据解析的实例

    2022-07-04 19:52:50
  • 解决RestTemplate加@Autowired注入不了的问题

    2022-07-14 03:00:48
  • asp之家 软件编程 m.aspxhome.com