我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java并发编程之线程安全性怎么实现

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java并发编程之线程安全性怎么实现

今天小编给大家分享一下Java并发编程之线程安全性怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

    1.什么是线程安全性

    当多个线程访问某个类时,不管运行时环境采用何种调用方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的。

    无状态的对象一定是线程安全的,比如:Servlet

    2.原子性

    2.1 竞争条件

    由于不恰当的执行时序而出现不正确的结果的情况,就是竞争条件。

    “先检查后执行”操作,即通过一个可能实效的观测结果来决定下一步的动作。比如:延迟初始化。

    if(instance == null) {    instance = new SomeObject();}

    “读取-修改-写入”的操作,其结果状态依赖于之前的状态。如:递增运算。

    long count = 0;count++;

    2.2 复合操作

    原子操作是指,对于访问同一个状态的所有操作(包括此操作本身)来说,这个操作是以一个原子方式执行(不可分割)的操作。

    为了确保线程安全性,包含了一组必须以原子方式执行的操作,称为复合操作。

    递增运算可以使用一个现有的线程安全类,确保线程安全性。如:

    AtomicLong count = new AtomicLong(0);count.incrementAndGet();

    3.加锁机制

    当类只有一个状态变量时,可以通过线程安全的状态变量来维护类的线程安全性。但如果类有更多的状态时,就不能只添加更多线程安全的状态变量了。要保持状态的一致性,就需要在单个原子操作中更新所以相关的状态变量。

    3.1 内置锁

    Java提供一种内置锁:同步代码块,它包括:一个作为锁的对象引用、一个作为由这个锁保护的代码块。

    以关键字synchronized来修饰的方法就是一种横跨整个方法体的同步代码块,其中该同步代码块的锁就是方法调用所在的对象。静态的synchronized方法以Class对象作为锁。

    线程在进入同步代码块之前会自动获得锁,在退出同步代码块是自动释放锁。最多只有一个线程能持有这种锁,因此同步代码会以原子方式执行。

    3.2 重入

    内置锁是可重入的,意味着获取锁的操作的粒度是线程,不是调用。当某个线程试图获得一个已经由它自己持有的锁时,这个请求也会成功。

    重入进一步提升了加锁行为的封装性,简化了面向对象并发代码的开发。

    public class Widget {    public synchronized void doSomething() {        //......    }}public class LoggingWidget extends Widget {    public synchronized void doSomething() {        //......        super.doSomething();//假如没有可重入的锁,该语句将产生死锁。    }}

    4.用锁保护状态

    对于可能被多个线程同时访问的可变状态变量,在访问它时都需要持有同一个锁,在这种情况下,称状态变量是由这个锁保护的。

    5.活跃性与性能

    粗粒度地使用锁,虽然确保了线程安全性,但可能造成性能问题和活跃度问题,如:

    @ThreadSafepublic class SynchronizedFactorizer implements Servlet {    @GuardedBy("this") private BigInteger lastNumber;    @GuardedBy("this") private BigInteger[] lastFactors;    public synchronized void service(ServletRequest req,                                     ServletResponse resp) {        BigInteger i = extractFromRequest(req);        if (i.equals(lastNumber))            encodeIntoResponse(resp, lastFactors);        else {            BigInteger[] factors = factor(i);//因数分解计算            lastNumber = i;            lastFactors = factors;//存放上一次计算结果            encodeIntoResponse(resp, factors);        }    }}

    可以通过缩小同步代码块,既确保servlet的并发型,又维护线程安全性。不要把本应是原子操作拆分到多个同步代码块中,尽量将不影响共享状态且执行时间较长的操作从同步代码中分离出来。如:

    public class CachedFactorizer implements Servlet {    @GuardedBy("this") private BigInteger lastNumber;    @GuardedBy("this") private BigInteger[] lastFactors;    public void service(ServletRequest req, ServletResponse resp) {        BigInteger i = extractFromRequest(req);         BigInteger[] factors = null;              synchronized (this) {            if (i.equals(lastNumber)) {               factors = lastFactors.clone();            }                 }            if (factors == null) {                    factors = factor(i);            synchronized (this) {               lastNumber = i;               lastFactors = factors.clone();            }        }        encodeIntoResponse(resp, factors);    }}

    以上就是“Java并发编程之线程安全性怎么实现”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    Java并发编程之线程安全性怎么实现

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    Java并发编程之线程安全性怎么实现

    今天小编给大家分享一下Java并发编程之线程安全性怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.什么是线程安全性
    2023-06-29

    Java并发编程之线程怎么创建

    本篇内容主要讲解“Java并发编程之线程怎么创建”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java并发编程之线程怎么创建”吧!1.线程与进程进程是代码在数据集合上的一次运行活动,是系统进行资
    2023-06-30

    Java并发编程之介绍线程安全基础的示例

    这篇文章主要介绍了Java并发编程之介绍线程安全基础的示例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。线程安全基础1.线程安全问题2.账户取款案例3.同步代码块synchr
    2023-06-06

    Java并发和线程安全怎么掌握

    本文小编为大家详细介绍“Java并发和线程安全怎么掌握”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java并发和线程安全怎么掌握”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。为什么有多线程谈到多线程,我们很容
    2023-06-02

    Java并发编程之线程状态实例分析

    今天小编给大家分享一下Java并发编程之线程状态实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。线程状态概述线程由生到
    2023-06-30

    Java中怎么实现线程安全

    Java中怎么实现线程安全,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、使用synchronized关键字synchronized关键字可以修饰方法和代码块,它的语义是
    2023-06-16

    Java并发编程之对象的共享怎么实现

    这篇文章主要介绍“Java并发编程之对象的共享怎么实现”,在日常操作中,相信很多人在Java并发编程之对象的共享怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java并发编程之对象的共享怎么实现”的疑
    2023-06-29

    Golang函数并发编程中数据结构的线程安全性

    在 golang 中确保数据结构的线程安全性至关重要。可以使用以下方法:互斥锁:保证同一时刻只有一个 goroutine 访问共享数据。读写锁:允许并发读取,但只能同时执行一个写入。通道:保证发送和接收数据是原子的操作。原子操作:直接操作内
    Golang函数并发编程中数据结构的线程安全性
    2024-04-17

    java多线程并发执行怎么实现

    在Java中实现多线程的并发执行有多种方式,以下是其中的几种常见方法:1. 继承Thread类:创建一个继承自Thread类的子类,并重写其run()方法。然后创建多个该子类的实例,并调用start()方法来启动线程。```javaclas
    2023-09-27

    java怎么实现多线程并发执行

    Java实现多线程并发执行的方式有两种:继承Thread类和实现Runnable接口。继承Thread类:定义一个类,继承Thread类,重写run()方法,在run()方法中写入线程执行的逻辑。创建线程对象,调用start()方法启动线
    2023-10-25

    Java并发之怎么使用线程池

    这篇文章主要介绍“Java并发之怎么使用线程池”,在日常操作中,相信很多人在Java并发之怎么使用线程池问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java并发之怎么使用线程池”的疑惑有所帮助!接下来,请跟
    2023-06-16

    怎么用Java高并发编程之CountDownLatch

    本篇文章为大家展示了怎么用Java高并发编程之CountDownLatch,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。什么是CountDownLatchCountDownLatch是通过一个计数器
    2023-06-15

    Golang并发编程之GMP模型怎么实现

    本文小编为大家详细介绍“Golang并发编程之GMP模型怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Golang并发编程之GMP模型怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。0. 简介传统
    2023-07-05

    Java中怎么实现线程编程

    Java中怎么实现线程编程,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、继承Threadpublic class T4 {public static void main
    2023-06-20

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录