Java并发编程(二):同步机制与多线程是否矛盾


大家好,我是欧阳方超,可以关注我的公众号“欧阳方超”,后续内容将在公众号首发。

在这里插入图片描述

0 纠正对异步和多选误解

行文之前先纠正一下对异步和多线程的误解,之前准备写Java多线程系列的文章时,起的标题为Java异步编程,现在看来是不确切的,尽管多线程和异步有着一些联系,但它们也有区别。它们的联系是多线程可以用来实现异步操作,例如,Java中可以使用ExecutorService来管理线程池,并通过异步方法提交任务,从而实现非阻塞调用。而区别是,异步是为了提高程序的响应性,使得主线程不被阻塞,而可以继续处理其他任务。多线程是实现并发的一种方式,通过多个线程同时执行任务来提高效率。

1 概述

同步机制会确保某一时刻只有一个线程能访问同步代码块或方法,其他线程一直等待,那这跟只用一个主线程执行任务有什么区别,这个问题困惑我已久,多方查阅资料后似乎解惑了,本文就回答一下这个问题,算是对自己的交代。

2 为什么要引入同步机制

我们都知道,使用多线程时,不同线程可能会访问共享资源,比如修改同一个变量或者读写同一个文件。如果不同线程之间没有同步机制,就会导致数据不一致的问题。这就是为什么需要引入同步机制来保证线程安全。比较基本的一种同步机制是使用synchronized关键字,它可以确保在某一时刻,只有一个线程可以执行某个被同步的代码块或方法,其他要执行这块代码或方法的线程需等待,从而避免了多个线程同时访问共享资源时可能会出现的问题。比如:

public class Counter {
    private int count = 0;

    // 使用 synchronized 确保每次只有一个线程能执行这个方法
    public synchronized void increment() {
        count++;
    }

    public synchronized void decrement() {
        count--;
    }

    public synchronized int getCount() {
        return count;
    }
}

如果没有 synchronized,当多个线程同时调用 increment() 或 decrement() 时,可能会发生不可预测的结果,因为两个线程可能同时修改 count,导致数据不一致。

3 为什么多线程依然有意义

但是有一个问题一直让我困惑, 既然引入同步机制后,也只能有一个线程执行同步代码块或方法,那这跟只使用一个线程执行任务有什么区别,多方查资料后,有一天这个问题终于想明白了,如果单单说同步代码块或方法,同一时刻只有一个线程能执行,这跟只用主线程执行这个同步代码块或方法,可能区别不大,但是问题在于程序中不可能处处都是共享资源吧,所以也就不可能处处都设置为同步代码块或方法吧(这也是锁的使用原则,合理设计锁的力度和范围,避免出现“大锁”),既然如此那些没有设置为同步代码块或方法的地方,依然可以使用多个线程来执行,所以多线效率的效率整体上还是高于单个主线程单独执行的效率的。

3 总结

  • 多线程的必要性:多线程的主要目的是提高程序的并发性和性能,尤其是在任务之间可以并行执行时,能够显著缩短总的执行时间。
  • 同步的作用:同步确保在多线程环境下,访问共享资源时的数据一致性。虽然它会引入一些等待,但它只是保护共享资源的访问,并不意味着多线程就无法提高效率。
  • 多线程依然有意义:即使有同步存在,多个线程依然可以并行执行独立的任务,从而提高总体的吞吐量和效率。

我是欧阳方超,把事情做好了自然就有兴趣了,如果你喜欢我的文章,欢迎点赞、转发、评论加关注。我们下次见。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值