广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java并发编程之线程安全性
  • 813
分享到

Java并发编程之线程安全性

2024-04-02 19:04:59 813人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录1.什么是线程安全性2.原子性2.1 竞争条件2.2 复合操作3.加锁机制3.1 内置锁3.2 重入4.用锁保护状态5.活跃性与性能1.什么是线程安全性 当多个线程访问某个类时,

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.活跃性与性能

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

@ThreadSafe
public 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并发编程之线程安全性的文章就介绍到这了,更多相关Java 线程安全性内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java并发编程之线程安全性

本文链接: https://www.lsjlt.com/news/145231.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Java并发编程之线程安全性
    目录1.什么是线程安全性2.原子性2.1 竞争条件2.2 复合操作3.加锁机制3.1 内置锁3.2 重入4.用锁保护状态5.活跃性与性能1.什么是线程安全性 当多个线程访问某个类时,...
    99+
    2022-11-13
  • Java并发编程之线程安全性怎么实现
    今天小编给大家分享一下Java并发编程之线程安全性怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.什么是线程安全性...
    99+
    2023-06-29
  • Java并发编程之介绍线程安全基础的示例
    这篇文章主要介绍了Java并发编程之介绍线程安全基础的示例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。线程安全基础线程安全问题账户取款案例同步代码块synchronized...
    99+
    2023-06-06
  • Java并发编程之线程中断
    目录线程中断: void interrupted()方法:中断线程,例如,当线程A运行时,线程B可以调用线程A的interrupted()方法来设置线程的中断标志为true并立即返回...
    99+
    2022-11-12
  • Java并发编程面试之线程池
    目录什么是线程池线程池好处线程池的执行流程怎么用线程池corePoolSizemaximumPoolSizekeepAliveTimeunitworkQueuethreadFacto...
    99+
    2022-11-12
  • 理解Java多线程之并发编程
    目录1 多线程的使用场景2 多线程的缺点2.1 上下文切换的开销(1)上下文切换的开销(2)如何减少上下文切换2.2 多线程中的数据一致性问题(1)线程中访问外部数据的过程(2)线程...
    99+
    2023-02-02
    Java并发编程 java并发编程实战 java并发编程的艺术
  • Java并发编程之线程间的通信
    目录一、概念简介1、线程通信2、等待通知机制3、基础方法二、等待通知原理1、基本原理2、实现案例三、管道流通信1、管道流简介2、使用案例四、生产消费模式1、业务场景2、代码实现五、源...
    99+
    2022-11-12
  • Java并发编程之线程创建介绍
    目录1.线程与进程2.线程的创建与运行1.线程与进程 进程是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,线程则是一个实体,一个进程中至少有一个线程,是CPU调...
    99+
    2022-11-13
  • Java并发编程之线程状态介绍
    目录线程状态概述睡眠sleep方法等待和唤醒等待唤醒的一个小例子线程状态概述 线程由生到死的完整过程: 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态...
    99+
    2022-11-13
  • Java并发编程之线程怎么创建
    本篇内容主要讲解“Java并发编程之线程怎么创建”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java并发编程之线程怎么创建”吧!1.线程与进程进程是代码在数据集合上的一次运行活动,是系统进行资...
    99+
    2023-06-30
  • Java并发编程:同步机制与线程安全探究
    在现代软件开发中,多线程编程已经成为了必不可少的一部分。在Java中,线程的使用非常方便,但是也带来了一些问题,比如线程安全问题。为了解决这些问题,Java提供了一些同步机制。在本文中,我们将探究Java中的同步机制和线程安全。 一、线程...
    99+
    2023-11-09
    同步 numy 日志
  • python并发编程之多线程编程
    一、threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍 二、开启线程的两种方式 方式一: from threading import ...
    99+
    2023-01-31
    之多 线程 python
  • Java并发编程进阶之线程控制篇
    目录一、线程的基本概念1.并行和并发2.进程和线程二、线程的运行状态三、线程操作实践1.线程两种定义方法2.启动线程3.同时定义和启动线程4.线程弹出与暂停5.线程等待与唤醒6.线程...
    99+
    2022-11-13
  • Java并发编程之详解CyclicBarrier线程同步
    CyclicBarrier线程同步 java.util.concurrent.CyclicBarrier提供了一种多线程彼此等待的同步机制,可以把它理解成一个障碍,所有先到达这个障碍...
    99+
    2022-11-12
  • Java并发编程之线程之间的共享和协作
    目录一、线程间的共享1.1 ynchronized内置锁1.2 volatile关键字1.3 ThreadLocal1.4 Spring的事务借助ThreadLocal类1.4.1 ...
    99+
    2022-11-12
  • Java并发编程之线程状态实例分析
    今天小编给大家分享一下Java并发编程之线程状态实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。线程状态概述线程由生到...
    99+
    2023-06-30
  • Java并发编程之线程池的示例分析
    这篇文章将为大家详细讲解有关Java并发编程之线程池的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是线程池是一种基于池化思想管理线程的工具。池化技术:池化技术简单点来说,就是提前保存大量的资...
    99+
    2023-06-20
  • Java并发编程之threadLocal
    目录1、ThreadLocal介绍2、ThreadLocal使用实例3、ThreadLocal实现原理1、ThreadLocal介绍 多个线程访问同一个共享变量时特别容易出现并发问题...
    99+
    2022-11-12
  • Java多线程并发之ReentrantLock
    目录ReentrantLock公平锁和非公平锁重入锁小结疑惑ReentrantLock 公平锁和非公平锁 这个类是接口 Lock的实现类,也是悲观锁的一种,但是它提供了 lock和 ...
    99+
    2023-05-18
    Java 多线程并发 Java ReentrantLock
  • Java中的并发编程:如何使用ConcurrentLinkedQueue实现线程安全?
    在Java中,我们经常需要使用多线程来提高程序的运行效率。但是多线程编程也会带来线程安全的问题,其中一个常见的问题就是多个线程同时操作同一个数据结构,可能会出现数据不一致或者数据丢失等问题。为了解决这个问题,Java提供了多种线程安全的数...
    99+
    2023-09-19
    并发 数组 容器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作