【并发多线程】java并发中的Synchronized关键词

这篇具有很好参考价值的文章主要介绍了【并发多线程】java并发中的Synchronized关键词。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

如果在多线程的环境中,我们经常会遇到资源竞争的情况,比如多个线程要去同时修改同一个共享变量,这时候,就需要对资源的访问方法进行一定的处理,保证同一时间只有一个线程访问。

java提供了synchronized关键字,方便我们实现上述操作。

为什么要同步

我们举个例子,我们创建一个类,提供了一个setSum的方法:

public class SynchronizedMethods {

    private int sum = 0;

    public void calculate() {
        setSum(getSum() + 1);
    }
}

如果我们在多线程的环境中调用这个calculate方法:

@Test
public void givenMultiThread_whenNonSyncMethod() throws InterruptedException {
    ExecutorService service = Executors.newFixedThreadPool(3);
    SynchronizedMethods summation = new SynchronizedMethods();

    IntStream.range(0, 1000)
            .forEach(count -> service.submit(summation::calculate));
    service.shutdown();
    service.awaitTermination(1000, TimeUnit.MILLISECONDS);

    assertEquals(1000, summation.getSum());
}

按照上面的方法,我们预计要返回1000, 但是实际上基本不可能得到1000这个值,因为在多线程环境中,对同一个资源进行同时操作带来的不利影响。

那我们怎么才能够建线程安全的环境呢?

Synchronized关键词

java提供了多种线程安全的方法,本文主要讲解Synchronized关键词,Synchronized关键词可以有很多种形式:

  • Instance methods
  • Static methods
  • Code blocks

当我们使用synchronized时,java会在相应的对象上加锁,从而在同一个对象等待锁的方法都必须顺序执行,从而保证了线程的安全。

Synchronized Instance Methods
Synchronized关键词可以放在实例方法的前面:

   public synchronized void synchronisedCalculate() {
        setSum(getSum() + 1);
    }

看下调用结果:

@Test
public void givenMultiThread_whenMethodSync() {
    ExecutorService service = Executors.newFixedThreadPool(3);
    SynchronizedMethods method = new SynchronizedMethods();

    IntStream.range(0, 1000)
      .forEach(count -> service.submit(method::synchronisedCalculate));
    service.awaitTermination(1000, TimeUnit.MILLISECONDS);

    assertEquals(1000, method.getSum());
}

这里synchronized将会锁住该方法的实例对象,多个线程中只有获得该实例对象锁的线程才能够执行。

Synchronized Static Methods
Synchronized关键词也可以用在static方法前面:

public static synchronized void syncStaticCalculate() {
    staticSum = staticSum + 1;
}

Synchronized放在static方法前面和实例方法前面锁住的对象不同。放在static方法前面锁住的对象是这个Class本身,因为一个Class在JVM中只会存在一个,所以不管有多少该Class的实例,在同一时刻只会有一个线程可以执行该放方法。

@Test
public void givenMultiThread_whenStaticSyncMethod() throws InterruptedException {
    ExecutorService service = Executors.newCachedThreadPool();

    IntStream.range(0, 1000)
            .forEach(count ->
                    service.submit(SynchronizedMethods::syncStaticCalculate));
    service.shutdown();
    service.awaitTermination(100, TimeUnit.MILLISECONDS);

    assertEquals(1000, SynchronizedMethods.staticSum);
}

Synchronized Blocks
有时候,我们可能不需要Synchronize整个方法,而是同步其中的一部分,这时候,我们可以使用Synchronized Blocks:

public void performSynchronizedTask() {
    synchronized (this) {
        setSum(getSum() + 1);
    }
}

我们看下怎么测试:

@Test
public void givenMultiThread_whenBlockSync() throws InterruptedException {
    ExecutorService service = Executors.newFixedThreadPool(3);
    SynchronizedMethods synchronizedBlocks = new SynchronizedMethods();

    IntStream.range(0, 1000)
            .forEach(count ->
                    service.submit(synchronizedBlocks::performSynchronizedTask));
    service.shutdown();
    service.awaitTermination(100, TimeUnit.MILLISECONDS);

    assertEquals(1000, synchronizedBlocks.getSum());
}

上面我们同步的是实例,如果在静态方法中,我们也可以同步class:

public static void performStaticSyncTask(){
    synchronized (SynchronizedMethods.class) {
        staticSum = staticSum + 1;
    }
}

我们看下怎么测试:文章来源地址https://www.toymoban.com/news/detail-412291.html

@Test
public void givenMultiThread_whenStaticSyncBlock() throws InterruptedException {
    ExecutorService service = Executors.newCachedThreadPool();

    IntStream.range(0, 1000)
            .forEach(count ->
                    service.submit(SynchronizedMethods::performStaticSyncTask));
    service.shutdown();
    service.awaitTermination(100, TimeUnit.MILLISECONDS);

    assertEquals(1000, SynchronizedMethods.staticSum);
}

到了这里,关于【并发多线程】java并发中的Synchronized关键词的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 安全渗透测试中的一款免费开源的超级关键词URL采集工具

    安全渗透测试中的一款免费开源的超级关键词URL采集工具

    安全渗透测试中的一款免费开源的超级URL采集工具。 #################### 免责声明:工具本身并无好坏,希望大家以遵守《网络安全法》相关法律为前提来使用该工具,支持研究学习,切勿用于非法犯罪活动,对于恶意使用该工具造成的损失,和本人及开发者无关。 ####

    2024年02月03日
    浏览(12)
  • 关键词组合工具-自动关键词挖掘组成关键词软件免费

    关键词组合工具-自动关键词挖掘组成关键词软件免费

    组合工具,今天给大家分享一款免费的挖掘工具。自动挖掘流量,过滤无效。自动组成,组成标题。以及自动采集文章。详细参考图片 不少的网站能在相关的搜索引擎呈现的话,组合工具普通都会被这个搜索引擎所收录,不然也

    2023年04月08日
    浏览(13)
  • GPT关键词挖掘,自动关键词文章生成

    GPT关键词挖掘,自动关键词文章生成

    随着互联网的发展,内容营销已成为企业营销策略中不可或缺的一环。有效的文章生成可以帮助企业吸引更多的潜在客户,提高品牌曝光度和转化率,从而实现营销目标。 文章生成是指根据特定的和主题,使用软件工具自动生成相关的文章内容。与传统的

    2024年02月01日
    浏览(10)
  • 实现同时查找多个关键词——KeywordCrafter - 关键词匠心

    实现同时查找多个关键词——KeywordCrafter - 关键词匠心

    具体功能:同时查找多个,高亮加粗显示,并显示出现次数。 🧐碎碎念:最近在写文案的时候,总是要避免出现一个敏感词汇,利用 (command+F) or (Ctr+F) 查找,只能一个一个单词去查,很麻烦。🤷‍♂️ 所以我写了一个简单的网页,在文本框输入一整篇文章,在

    2024年02月13日
    浏览(14)
  • 关键词生成器在线-在线免费关键词生成器

    关键词生成器在线-在线免费关键词生成器

    生成,什么是生成,生成就是根据你输入的一个生成成千上百的核心,围绕着你输入的核心词来生成的,优先生成大量用户搜索的,今天就给大家分享一款免费生成工具,生成的来源主要是用户都在搜索的词,相关搜索的

    2024年02月04日
    浏览(50)
  • 长尾关键词挖掘软件-免费的百度搜索关键词挖掘

    长尾关键词挖掘软件-免费的百度搜索关键词挖掘

    嗨,大家好!今天,我想和大家聊一聊长尾挖掘工具。作为一个在网络世界里摸爬滚打多年的人,我对这个话题有着一些个人的感悟和见解,希望能与大家分享。 首先,让我坦白一点,长尾挖掘工具对于我来说真是救命稻草。在我刚开始做网站优化和内容创作的

    2024年02月09日
    浏览(20)
  • Java并发之synchronized关键字和Lock接口

    欢迎点赞阅读,一同学习交流,有疑问请留言 。 GitHub上也有开源 JavaHouse,欢迎star 当开发过程中,我们遇到并发问题。怎么解决? 一种解决方式,简单粗暴:上锁。将千军万马都给拦下来,只允许一个人过独木桥。书面意思就是将并行的程序变成串行的程序。现实的锁有门锁

    2024年02月08日
    浏览(14)
  • 网站SEO关键词规划时如何筛选出合适的关键词?

    网站SEO关键词规划时如何筛选出合适的关键词?

    在网站SEO优化过程中,布局是一个至关重要的环节。首先,我们需要确定核心,然后通过各种策略和方法对进行扩展。完成扩展后,接下来的任务就是对这些扩展后的进行筛选。那么,如何进行有效的筛选呢?我们通常建议选择那些具有

    2024年04月17日
    浏览(19)
  • 关键词提取 | 基于Textrank算法的两种关键词提取

    关键词提取 | 基于Textrank算法的两种关键词提取

    目录 一、PageRank算法 二、TextRank算法 1. 抽取(keyword extraction) 2. 关键短语抽取(keyphrase extration) 3. 关键句抽取(sentence extraction) 三、TextRank算法实现 1. 基于Textrank4zh的TextRank算法实现 2. 基于jieba的TextRank算法实现 3. 基于SnowNLP的TextRank算法实现 四、PageRank算法与Text

    2024年04月14日
    浏览(35)
  • Stable Diffusion 告别猜关键词,LoRA适配关键词自动生成

    Stable Diffusion 告别猜关键词,LoRA适配关键词自动生成

    有没有想想过在SD绘图的时候下载好的LoRA模型选择之后不生效是为什么?或者说不知道怎么填写? 这里介绍基于 Civitai 的LoRA 使用方法。 如果没有安装的小伙伴可以参考前面的文章先对 Civitai 的模型管理进行安装和使用,确保你的SD主页已经出现了 Civitai 助手 选项卡。

    2024年02月09日
    浏览(14)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包