【Java基础】多线程之synchronized

2024-08-26 22:38

本文主要是介绍【Java基础】多线程之synchronized,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

为什么要用synchronized


          多线程可以提高效率,但是在共享变量的情况下,可能出现混乱的情况,比如A线程将共享变量 m=5,但是B线程在用m变量的时候,出现了混乱。这样多个线程共同访问同样的一个资源,你争我夺,一团乱。线程的不安全现象一触即发。所以必须要对这种资源冲突进行预防。

      所以,在共同访问的资源进行加锁即可,第一种方法就是同步锁,也即用关键字synchronized。该关键字可以加在方法和语句块中,也即是同步方法和同步语句块。

synchronized原理

           各个线程在调用关键字synchronized方法或者语句块的时候,需要排队进行。当A线程在调用该方法(或者语句块)的时候,要在该方法(或者语句块)上锁,B线程则等待,当然可以以异步的方法调用非synchronized方法。当A线程释放了synchronized方法(或者语句块),B线程才可以调用该方法。
    
       synchronized关键字还可以实现可重入锁,也就是一个线程连续几次获取同一把锁。

案例分析


      首先是方法类,代码如下:

package cn.itcast.java.base.synchronize;public class Task
{public void doLongTimeTask(){for (int i = 0; i < 100; i++){System.out.println("nosynchronized threadName="+Thread.currentThread().getName()+"i="+(i+1));}System.out.println("");synchronized (this){for (int i = 0; i < 100; i++){System.out.println("synchronized threadName="+Thread.currentThread().getName()+"i="+(i+1));}}}
}

      接下来是自定义的线程类,这里一共有2个线程:

package cn.itcast.java.base.synchronize;public class MyThread1 extends Thread
{private Task task;public MyThread1(Task task){super();this.task=task;}public void run(){super.run();task.doLongTimeTask();}}

package cn.itcast.java.base.synchronize;public class MyThread2 extends Thread
{private Task task;public MyThread2(Task task){super();this.task=task;}public void run(){super.run();task.doLongTimeTask();}}


    接下来是run方法:

    
package cn.itcast.java.base.synchronize;public class Run
{public static void main(String[] args)
{Task task=new Task();MyThread1 thread1=new MyThread1(task);thread1.start();MyThread2 thread2=new MyThread2(task);thread2.start();
}
}
   
     我们看一下运行结果:

     
nosynchronized threadName=Thread-0i=1
nosynchronized threadName=Thread-1i=1
nosynchronized threadName=Thread-0i=2
nosynchronized threadName=Thread-1i=2
nosynchronized threadName=Thread-0i=3
nosynchronized threadName=Thread-1i=3
nosynchronized threadName=Thread-0i=4
nosynchronized threadName=Thread-1i=4
nosynchronized threadName=Thread-0i=5
nosynchronized threadName=Thread-1i=5
nosynchronized threadName=Thread-0i=6
nosynchronized threadName=Thread-1i=6
nosynchronized threadName=Thread-0i=7
nosynchronized threadName=Thread-0i=8
nosynchronized threadName=Thread-0i=9
nosynchronized threadName=Thread-1i=7
nosynchronized threadName=Thread-0i=10
nosynchronized threadName=Thread-1i=8
nosynchronized threadName=Thread-0i=11
nosynchronized threadName=Thread-0i=12
nosynchronized threadName=Thread-0i=13
nosynchronized threadName=Thread-1i=9
nosynchronized threadName=Thread-0i=14
nosynchronized threadName=Thread-1i=10
nosynchronized threadName=Thread-0i=15
nosynchronized threadName=Thread-1i=11
nosynchronized threadName=Thread-0i=16
nosynchronized threadName=Thread-0i=17
nosynchronized threadName=Thread-0i=18
nosynchronized threadName=Thread-0i=19
nosynchronized threadName=Thread-0i=20
nosynchronized threadName=Thread-0i=21
nosynchronized threadName=Thread-0i=22
nosynchronized threadName=Thread-0i=23
nosynchronized threadName=Thread-0i=24
nosynchronized threadName=Thread-0i=25
nosynchronized threadName=Thread-0i=26
nosynchronized threadName=Thread-0i=27
nosynchronized threadName=Thread-0i=28
nosynchronized threadName=Thread-0i=29
nosynchronized threadName=Thread-1i=12
nosynchronized threadName=Thread-0i=30
nosynchronized threadName=Thread-1i=13
nosynchronized threadName=Thread-0i=31
nosynchronized threadName=Thread-1i=14
nosynchronized threadName=Thread-0i=32
nosynchronized threadName=Thread-1i=15
nosynchronized threadName=Thread-0i=33
nosynchronized threadName=Thread-1i=16
nosynchronized threadName=Thread-0i=34
nosynchronized threadName=Thread-1i=17
nosynchronized threadName=Thread-0i=35
nosynchronized threadName=Thread-1i=18
nosynchronized threadName=Thread-0i=36
nosynchronized threadName=Thread-1i=19
nosynchronized threadName=Thread-0i=37
nosynchronized threadName=Thread-0i=38
nosynchronized threadName=Thread-1i=20
nosynchronized threadName=Thread-0i=39
nosynchronized threadName=Thread-1i=21
nosynchronized threadName=Thread-0i=40
nosynchronized threadName=Thread-1i=22
nosynchronized threadName=Thread-0i=41
nosynchronized threadName=Thread-1i=23
nosynchronized threadName=Thread-0i=42
nosynchronized threadName=Thread-1i=24
nosynchronized threadName=Thread-0i=43
nosynchronized threadName=Thread-1i=25
nosynchronized threadName=Thread-0i=44
nosynchronized threadName=Thread-1i=26
nosynchronized threadName=Thread-0i=45
nosynchronized threadName=Thread-1i=27
nosynchronized threadName=Thread-0i=46
nosynchronized threadName=Thread-1i=28
nosynchronized threadName=Thread-0i=47
nosynchronized threadName=Thread-1i=29
nosynchronized threadName=Thread-0i=48
nosynchronized threadName=Thread-1i=30
nosynchronized threadName=Thread-0i=49
nosynchronized threadName=Thread-0i=50
nosynchronized threadName=Thread-1i=31
nosynchronized threadName=Thread-1i=32
nosynchronized threadName=Thread-1i=33
nosynchronized threadName=Thread-1i=34
nosynchronized threadName=Thread-0i=51
nosynchronized threadName=Thread-1i=35
nosynchronized threadName=Thread-0i=52
nosynchronized threadName=Thread-1i=36
nosynchronized threadName=Thread-0i=53
nosynchronized threadName=Thread-0i=54
nosynchronized threadName=Thread-0i=55
nosynchronized threadName=Thread-0i=56
nosynchronized threadName=Thread-0i=57
nosynchronized threadName=Thread-0i=58
nosynchronized threadName=Thread-0i=59
nosynchronized threadName=Thread-0i=60
nosynchronized threadName=Thread-0i=61
nosynchronized threadName=Thread-0i=62
nosynchronized threadName=Thread-1i=37
nosynchronized threadName=Thread-0i=63
nosynchronized threadName=Thread-1i=38
nosynchronized threadName=Thread-0i=64
nosynchronized threadName=Thread-1i=39
nosynchronized threadName=Thread-0i=65
nosynchronized threadName=Thread-1i=40
nosynchronized threadName=Thread-0i=66
nosynchronized threadName=Thread-1i=41
nosynchronized threadName=Thread-0i=67
nosynchronized threadName=Thread-1i=42
nosynchronized threadName=Thread-0i=68
nosynchronized threadName=Thread-1i=43
nosynchronized threadName=Thread-0i=69
nosynchronized threadName=Thread-1i=44
nosynchronized threadName=Thread-0i=70
nosynchronized threadName=Thread-1i=45
nosynchronized threadName=Thread-0i=71
nosynchronized threadName=Thread-1i=46
nosynchronized threadName=Thread-0i=72
nosynchronized threadName=Thread-1i=47
nosynchronized threadName=Thread-1i=48
nosynchronized threadName=Thread-1i=49
nosynchronized threadName=Thread-1i=50
nosynchronized threadName=Thread-1i=51
nosynchronized threadName=Thread-0i=73
nosynchronized threadName=Thread-1i=52
nosynchronized threadName=Thread-0i=74
nosynchronized threadName=Thread-1i=53
nosynchronized threadName=Thread-0i=75
nosynchronized threadName=Thread-1i=54
nosynchronized threadName=Thread-0i=76
nosynchronized threadName=Thread-0i=77
nosynchronized threadName=Thread-0i=78
nosynchronized threadName=Thread-0i=79
nosynchronized threadName=Thread-0i=80
nosynchronized threadName=Thread-1i=55
nosynchronized threadName=Thread-0i=81
nosynchronized threadName=Thread-0i=82
nosynchronized threadName=Thread-1i=56
nosynchronized threadName=Thread-0i=83
nosynchronized threadName=Thread-1i=57
nosynchronized threadName=Thread-1i=58
nosynchronized threadName=Thread-0i=84
nosynchronized threadName=Thread-1i=59
nosynchronized threadName=Thread-0i=85
nosynchronized threadName=Thread-1i=60
nosynchronized threadName=Thread-0i=86
nosynchronized threadName=Thread-1i=61
nosynchronized threadName=Thread-0i=87
nosynchronized threadName=Thread-1i=62
nosynchronized threadName=Thread-0i=88
nosynchronized threadName=Thread-1i=63
nosynchronized threadName=Thread-0i=89
nosynchronized threadName=Thread-1i=64
nosynchronized threadName=Thread-0i=90
nosynchronized threadName=Thread-1i=65
nosynchronized threadName=Thread-0i=91
nosynchronized threadName=Thread-1i=66
nosynchronized threadName=Thread-0i=92
nosynchronized threadName=Thread-1i=67
nosynchronized threadName=Thread-0i=93
nosynchronized threadName=Thread-1i=68
nosynchronized threadName=Thread-0i=94
nosynchronized threadName=Thread-1i=69
nosynchronized threadName=Thread-0i=95
nosynchronized threadName=Thread-1i=70
nosynchronized threadName=Thread-0i=96
nosynchronized threadName=Thread-1i=71
nosynchronized threadName=Thread-0i=97
nosynchronized threadName=Thread-1i=72
nosynchronized threadName=Thread-0i=98
nosynchronized threadName=Thread-1i=73
nosynchronized threadName=Thread-0i=99
nosynchronized threadName=Thread-1i=74
nosynchronized threadName=Thread-0i=100
nosynchronized threadName=Thread-1i=75nosynchronized threadName=Thread-1i=76
synchronized threadName=Thread-0i=1
nosynchronized threadName=Thread-1i=77
synchronized threadName=Thread-0i=2
nosynchronized threadName=Thread-1i=78
synchronized threadName=Thread-0i=3
synchronized threadName=Thread-0i=4
synchronized threadName=Thread-0i=5
nosynchronized threadName=Thread-1i=79
synchronized threadName=Thread-0i=6
nosynchronized threadName=Thread-1i=80
synchronized threadName=Thread-0i=7
nosynchronized threadName=Thread-1i=81
synchronized threadName=Thread-0i=8
synchronized threadName=Thread-0i=9
synchronized threadName=Thread-0i=10
synchronized threadName=Thread-0i=11
synchronized threadName=Thread-0i=12
synchronized threadName=Thread-0i=13
synchronized threadName=Thread-0i=14
synchronized threadName=Thread-0i=15
synchronized threadName=Thread-0i=16
synchronized threadName=Thread-0i=17
synchronized threadName=Thread-0i=18
synchronized threadName=Thread-0i=19
synchronized threadName=Thread-0i=20
synchronized threadName=Thread-0i=21
synchronized threadName=Thread-0i=22
synchronized threadName=Thread-0i=23
nosynchronized threadName=Thread-1i=82
synchronized threadName=Thread-0i=24
nosynchronized threadName=Thread-1i=83
synchronized threadName=Thread-0i=25
nosynchronized threadName=Thread-1i=84
synchronized threadName=Thread-0i=26
nosynchronized threadName=Thread-1i=85
synchronized threadName=Thread-0i=27
nosynchronized threadName=Thread-1i=86
synchronized threadName=Thread-0i=28
nosynchronized threadName=Thread-1i=87
synchronized threadName=Thread-0i=29
nosynchronized threadName=Thread-1i=88
synchronized threadName=Thread-0i=30
synchronized threadName=Thread-0i=31
synchronized threadName=Thread-0i=32
synchronized threadName=Thread-0i=33
nosynchronized threadName=Thread-1i=89
synchronized threadName=Thread-0i=34
nosynchronized threadName=Thread-1i=90
synchronized threadName=Thread-0i=35
nosynchronized threadName=Thread-1i=91
synchronized threadName=Thread-0i=36
nosynchronized threadName=Thread-1i=92
synchronized threadName=Thread-0i=37
nosynchronized threadName=Thread-1i=93
synchronized threadName=Thread-0i=38
nosynchronized threadName=Thread-1i=94
nosynchronized threadName=Thread-1i=95
nosynchronized threadName=Thread-1i=96
nosynchronized threadName=Thread-1i=97
synchronized threadName=Thread-0i=39
nosynchronized threadName=Thread-1i=98
synchronized threadName=Thread-0i=40
nosynchronized threadName=Thread-1i=99
synchronized threadName=Thread-0i=41
nosynchronized threadName=Thread-1i=100synchronized threadName=Thread-0i=42
synchronized threadName=Thread-0i=43
synchronized threadName=Thread-0i=44
synchronized threadName=Thread-0i=45
synchronized threadName=Thread-0i=46
synchronized threadName=Thread-0i=47
synchronized threadName=Thread-0i=48
synchronized threadName=Thread-0i=49
synchronized threadName=Thread-0i=50
synchronized threadName=Thread-0i=51
synchronized threadName=Thread-0i=52
synchronized threadName=Thread-0i=53
synchronized threadName=Thread-0i=54
synchronized threadName=Thread-0i=55
synchronized threadName=Thread-0i=56
synchronized threadName=Thread-0i=57
synchronized threadName=Thread-0i=58
synchronized threadName=Thread-0i=59
synchronized threadName=Thread-0i=60
synchronized threadName=Thread-0i=61
synchronized threadName=Thread-0i=62
synchronized threadName=Thread-0i=63
synchronized threadName=Thread-0i=64
synchronized threadName=Thread-0i=65
synchronized threadName=Thread-0i=66
synchronized threadName=Thread-0i=67
synchronized threadName=Thread-0i=68
synchronized threadName=Thread-0i=69
synchronized threadName=Thread-0i=70
synchronized threadName=Thread-0i=71
synchronized threadName=Thread-0i=72
synchronized threadName=Thread-0i=73
synchronized threadName=Thread-0i=74
synchronized threadName=Thread-0i=75
synchronized threadName=Thread-0i=76
synchronized threadName=Thread-0i=77
synchronized threadName=Thread-0i=78
synchronized threadName=Thread-0i=79
synchronized threadName=Thread-0i=80
synchronized threadName=Thread-0i=81
synchronized threadName=Thread-0i=82
synchronized threadName=Thread-0i=83
synchronized threadName=Thread-0i=84
synchronized threadName=Thread-0i=85
synchronized threadName=Thread-0i=86
synchronized threadName=Thread-0i=87
synchronized threadName=Thread-0i=88
synchronized threadName=Thread-0i=89
synchronized threadName=Thread-0i=90
synchronized threadName=Thread-0i=91
synchronized threadName=Thread-0i=92
synchronized threadName=Thread-0i=93
synchronized threadName=Thread-0i=94
synchronized threadName=Thread-0i=95
synchronized threadName=Thread-0i=96
synchronized threadName=Thread-0i=97
synchronized threadName=Thread-0i=98
synchronized threadName=Thread-0i=99
synchronized threadName=Thread-0i=100
synchronized threadName=Thread-1i=1
synchronized threadName=Thread-1i=2
synchronized threadName=Thread-1i=3
synchronized threadName=Thread-1i=4
synchronized threadName=Thread-1i=5
synchronized threadName=Thread-1i=6
synchronized threadName=Thread-1i=7
synchronized threadName=Thread-1i=8
synchronized threadName=Thread-1i=9
synchronized threadName=Thread-1i=10
synchronized threadName=Thread-1i=11
synchronized threadName=Thread-1i=12
synchronized threadName=Thread-1i=13
synchronized threadName=Thread-1i=14
synchronized threadName=Thread-1i=15
synchronized threadName=Thread-1i=16
synchronized threadName=Thread-1i=17
synchronized threadName=Thread-1i=18
synchronized threadName=Thread-1i=19
synchronized threadName=Thread-1i=20
synchronized threadName=Thread-1i=21
synchronized threadName=Thread-1i=22
synchronized threadName=Thread-1i=23
synchronized threadName=Thread-1i=24
synchronized threadName=Thread-1i=25
synchronized threadName=Thread-1i=26
synchronized threadName=Thread-1i=27
synchronized threadName=Thread-1i=28
synchronized threadName=Thread-1i=29
synchronized threadName=Thread-1i=30
synchronized threadName=Thread-1i=31
synchronized threadName=Thread-1i=32
synchronized threadName=Thread-1i=33
synchronized threadName=Thread-1i=34
synchronized threadName=Thread-1i=35
synchronized threadName=Thread-1i=36
synchronized threadName=Thread-1i=37
synchronized threadName=Thread-1i=38
synchronized threadName=Thread-1i=39
synchronized threadName=Thread-1i=40
synchronized threadName=Thread-1i=41
synchronized threadName=Thread-1i=42
synchronized threadName=Thread-1i=43
synchronized threadName=Thread-1i=44
synchronized threadName=Thread-1i=45
synchronized threadName=Thread-1i=46
synchronized threadName=Thread-1i=47
synchronized threadName=Thread-1i=48
synchronized threadName=Thread-1i=49
synchronized threadName=Thread-1i=50
synchronized threadName=Thread-1i=51
synchronized threadName=Thread-1i=52
synchronized threadName=Thread-1i=53
synchronized threadName=Thread-1i=54
synchronized threadName=Thread-1i=55
synchronized threadName=Thread-1i=56
synchronized threadName=Thread-1i=57
synchronized threadName=Thread-1i=58
synchronized threadName=Thread-1i=59
synchronized threadName=Thread-1i=60
synchronized threadName=Thread-1i=61
synchronized threadName=Thread-1i=62
synchronized threadName=Thread-1i=63
synchronized threadName=Thread-1i=64
synchronized threadName=Thread-1i=65
synchronized threadName=Thread-1i=66
synchronized threadName=Thread-1i=67
synchronized threadName=Thread-1i=68
synchronized threadName=Thread-1i=69
synchronized threadName=Thread-1i=70
synchronized threadName=Thread-1i=71
synchronized threadName=Thread-1i=72
synchronized threadName=Thread-1i=73
synchronized threadName=Thread-1i=74
synchronized threadName=Thread-1i=75
synchronized threadName=Thread-1i=76
synchronized threadName=Thread-1i=77
synchronized threadName=Thread-1i=78
synchronized threadName=Thread-1i=79
synchronized threadName=Thread-1i=80
synchronized threadName=Thread-1i=81
synchronized threadName=Thread-1i=82
synchronized threadName=Thread-1i=83
synchronized threadName=Thread-1i=84
synchronized threadName=Thread-1i=85
synchronized threadName=Thread-1i=86
synchronized threadName=Thread-1i=87
synchronized threadName=Thread-1i=88
synchronized threadName=Thread-1i=89
synchronized threadName=Thread-1i=90
synchronized threadName=Thread-1i=91
synchronized threadName=Thread-1i=92
synchronized threadName=Thread-1i=93
synchronized threadName=Thread-1i=94
synchronized threadName=Thread-1i=95
synchronized threadName=Thread-1i=96
synchronized threadName=Thread-1i=97
synchronized threadName=Thread-1i=98
synchronized threadName=Thread-1i=99
synchronized threadName=Thread-1i=100
    

          用synchronized(this)来锁定当前对象,通过语句块来进行同步。
     
       
        

  

这篇关于【Java基础】多线程之synchronized的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1109889

相关文章

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2