Java中的线程安全

关于多线程并发环境下,数据的安全问题。

 1.为什么这个是重点?

    以后在开发中,我们的项目都是运行在服务器当中,而服务器已经将线程的定义,线程对象的创建,线程的启动等,都已经实现完了。这些代码我们都不需要编写。

   最重要的是:你要知道,你编写的程序需要放到一个多线程的环境下运行,你更需要关注的是这些数据在多线程并发的环境下是否是安全的。

 2.什么时候数据在多线程并发的环境下会存在安全问题呢?

   三个条件:

       条件1:多线程并发

       条件2:有共享数据

       条件3:共享数据有修改的行为

   满足以上3个条件之后,就会存在线程安全问题

3.怎么解决线程安全问题呢?

    当多线程并发的环境下,有共享数据,并且这个数据还会被修改,此时就存在线程安全问题,怎么解决这个问题?

        线程排队执行。(不能并发)

        用排队执行解决线程安全问题。

        这种机制被称为:线程同步机制。

    专业术语叫做:线程同步,实际上就是线程不能并发了,线程必须排队执行。

    怎么解决线程安全问题呢?  使用:线程同步机制

线程同步就是线程排队了,线程排队了就会牺牲一部分效率,没办法,数据安全第一位,只有数据安全了,我们才可以谈效率,数据不安全,没有效率的事。

4.线程同步涉及两个专业术语:

    异步编程模型:

       线程t1和线程t2,各自执行各自的,t1不管t2,t2不管t1,谁也不需要等谁,这种编程模型叫做:异步编程模型。

       其实就是:多线程并发(效率较高)

   异步就是并发

    同步编程模型:

       线程t1和线程t2,在线程t1执行的时候,必须等待t2线程执行结束,或者说在t2线程执行的时候,必须等待t1线程执行结束,两个线程之间发生了等待关系,这就是同步编程模型。

     效率较低,线程排队执行。

     

    同步就是排队

5.Java中有三大变量?

     实例变量:在堆中

     静态变量:在方法区中

     局部变量:在栈中

以上三大变量中:局部变量永远都不会存在线程安全问题。因为局部变量不共享。(一个线程一个栈)局部变量在栈中,所以局部变量永远都不会共享。

 实例变量在堆中,堆只有一个。静态变量在方法区中,方法区只有一个。堆和方法区都是多线程共享的,所以可能存在线程安全问题。

 局部变量+常量:不会有线程安全问题

 成员变量:可能会有线程安全问题。

6.如果使用局部变量的话:

  建议使用:StringBuilder

  因为局部变量不存在线程安全问题。选择StringBuilder

  StringBuffer效率比较低。

 

   ArrayList是非线程安全的。

   Vector是线程安全的。

   HashMap HashSet是非线程安全的。

   Hashtable是线程安全的。

7.总结:

   synchronized有三种写法:

         第一种:同步代码块

            灵活

               synchronized(线程共享对象){

                    同步代码块;

               }

        第二种:在实例方法上使用synchronized,表示共享对象一定是this,并且同步代码块是整个方法体

        第三种:在静态方法上使用synchronized,表示找类栈。

         类锁永远只有一把,就算创建了100个对象,那类锁也只有一把。

         对象锁:1个对象1把锁,100个对象100把锁。类锁:100个对象,也可能只是1把类锁。

8.以后开发中应该怎么解决线程安全问题?

     是一上来就选择线程同步吗?Synchronized

        不是,synchronized会让程序的执行效率降低,用户体验不好。系统的用户吞吐量降低。用户体验差,在不得已的情况下在选择线程同步机制。

 第一种方案:尽量使用局部变量代替“实例变量和静态变量“

 第二种方案:如果必须是实力变量,那么可以考虑创建多个对象,这样实例变量的内存就不共享了。(一个线程对应1个对象,100个线程对应100个对象,对象不共享,就没有数据安全问题了)

 第三种方案:如果不能使用局部变量,对象也不能创建多个,这个时候就只能选择synchronized了,线程同步机制。

9.线程还有哪些内容呢?

  *守护线程

  *定时器

  *实现线程的第三种方式:FutureTask方式,实现Callable接口。(JDK8新特性)

  *关于Object类中的wait和notify方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/657692.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT自制软键盘 最完美、最简单、支持中文输入(二)

目录 一、前言 二、本自制虚拟键盘特点 三、中文输入原理 四、组合键输入 五、键盘事件模拟 六、界面 七、代码 7.1 frmKeyBoard 头文件代码 7.2 frmKeyBoard 源文件代码 八、使用示例 九、效果 十、结语 一、前言 由于系统自带虚拟键盘不一定好用,也不一…

【python】合理使用copy与deepcopy

合理使用**copy**与**deepcopy**对于dict和list等数据结构的对象,直接赋值使用的是引用的方式。而有些情况下需要复制整个对象,这时可以使用copy包里的copy和deepcopy,这两个函数的不同之处在于后者是递归复制的。效率也不一样:&a…

动态设置小程序IOS底部小黑条

创建setIOSAreaMixin.js文件 import {mapState,mapMutations } from vuexexport default {computed: {...mapState("ios_area", ["globalAreaClass", isSafeAreaCalculated])},mounted() {if (!this.isSafeAreaCalculated) {this.calculateSafeAreaClass(…

牛客网-----------[NOIP2006]数列

题目描述 给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k3时,这个序列是: 1,3,4,9,10,12,13&…

2024年重庆市公务员考试报名明天开始,招聘4530人!

2024年重庆公务员招录公告已出,招聘人数:4530人 ✅重庆市考重要时间节点 报名时间:2月1日9:00-2月6日9:00 缴费时间:2月8日 笔试时间:3月16日-17日 笔试查成绩时间:4月15日 面试时间:4月27日-2…

C++文件操作(1)

C文件操作 1.文本的写入及读取文本文件写入文本文件读取 2.二进制文件的写入及读取二进制文件写入二进制文件读取 3.小结 C也有处理文件的能力,其功能实现依赖文件流。文件流是C中用来处理文件输入输出的一种流类。文件流可以用于从文件中读取数据或将数据写入到文件…

《游戏-03_2D-开发》

基于《游戏-02_2D-开发》, 继续制作游戏: 首先要做的时切割人物Idle空闲状态下的动画, 在切割之前我们需要创建一个文件夹,用来存放动画控制器AnimatorContoller, 再创建一个人物控制器文件夹用来存放人物控制器&…

【Ubuntu 22.04.3 LTS】apt-get下载安装有关问题可能原因及解决方法

ubuntu 22.04.3 LTS unaccountably error 装啥啥没依赖 可能是用了不合适的源,换个就好了 Now, let’s take a look at the lsb_release output, with a special focus on the Codename, which could be a crucial piece of information. The lsb_release comm…

认识BPMN2.0

💖专栏简介 ✔️本专栏将从Camunda(卡蒙达) 7中的关键概念到实现中国式工作流相关功能。 ✔️文章中只包含演示核心代码及测试数据,完整代码可查看作者的开源项目snail-camunda ✔️请给snail-camunda 点颗星吧😘 💖说在前面 …

STM32单片机基本原理与应用(四)

直流电机驱动控制原理 1、电机正反转控制 在STM32中,直流电机的正反转控制主要通过改变电机输入电源的极性来实现。当电机的电压极性发生变化时,电机的旋转方向也会相应改变。在硬件电路中,可以通过继电器或晶体管等电子开关来切换电机的电源…

查找二叉树(tree_a)

时间限制:1秒 内存限制:128M 题目描述 已知一棵二叉树用邻接表结构存储,中序查找二叉树中值为x的结点(x在二叉树中是唯一的),并指出是第几个结点。 输入描述 第一行n为二叉树的结点个树&#xf…

【TCP】重传与超时机制

前言 在网络通信的世界里,传输控制协议(TCP)扮演着一个至关重要的角色。它确保了数据的可靠传输,就像邮差确保每一封信都能准确无误地送达收件人手中一样。但是,网络环境充满了不确定性,数据包可能会因为各…

新书速览|Docker与Kubernetes容器运维实战

帮助读者用最短的时间掌握Docker与K8s运维技能 内容简介 随着云计算和容器技术的发展,Docker与Kubernetes已经成为各个企业首选的部署工具,使用它们可以提高系统的部署效率和运维能力,降低运维成本。本书是一本为初学者量身定制的Docker与Kub…

Android PMS——PMS服务启动流程(二)

PackageManagerService 既然是系统服务,那么肯定是通过 SystemServer 启动的,所以我们首先看一下 SystemServer 服务中启动 PackageManagerService 相关代码。 一、PMS启动 1、SystemServer 源码路径:/frameworks/base/services/java/com/…

iPhone手电筒不能工作的几种修复办法,总有一种适合你

这篇文章解释了为什么你的iPhone的手电筒不工作以及如何修复它。 手电筒不工作的原因 iPhone手电筒功能可能不起作用的原因有几个。通常,软件错误或小故障会导致该功能出现故障,但可能是你处于错误的电源模式或只需要充电。其他时候,确切的…

STM32F407移植OpenHarmony笔记4

上一篇写到make menuconfig报错,继续开整。 make menuconfig需要/device/soc/*下面有对应的Kconfig文件。 直接去gitee下载stm32的配置文件拿来参考用。 先提取Kconfig文件,后面再添加其它文件。https://gitee.com/openharmony/device_soc_st/tree/Open…

arcgis 如何将线路转为路面

在出外业的时候,用手机软件测出来的路(线要素),需要转换成路面。具体操作如下: 1.打开线图层 2.菜单-地理处理-缓冲区 在缓冲区中,输入要转换的线要素,在线性单位下方填写要转换的面的宽度&am…

[E模拟] lc2670. 找出不同元素数目差数组(哈希表+状态压缩)

文章目录 1. 题目来源2. 题目解析 1. 题目来源 链接:2670. 找出不同元素数目差数组 2. 题目解析 哈希计数统计就行了,题解里有看到用 long 64 位进行状态压缩的,可以参考下。这类题就不纠结写法了。 思路: 两个哈希表&#x…

回响科技二面面试题解答

面试题 1、你们的数仓中DWD层为什么要划分数据域?划分数据域之后会对ADS层造成什么影响?是可以提效还是可扩展性强?你们是如何考虑的呢? 2、AZkaban和dolphinScheduler的区别是什么?如果选型会从哪几个方面来考虑呢&a…

《Numpy 简易速速上手小册》第10章:Numpy案例研究和实践技巧(2024 最新版)

文章目录 10.1 实际案例分析10.1.1 基础知识10.1.2 完整案例:天气数据分析10.1.3 拓展案例 1:股票价格分析10.1.4 拓展案例 2:信号处理 10.2 Numpy 最佳实践10.2.1 基础知识10.2.2 完整案例:高效数组操作10.2.3 拓展案例 1&#x…