问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何创建线程?如何保证线程安全?

发布网友 发布时间:2022-04-01 12:31

我来回答

3个回答

懂视网 时间:2022-04-01 16:53

保证线程安全以是否需要同步手段分类,分为同步方案和无需同步方案。如下:

  

  1、互斥同步。

  

  互斥同步是最常见的一种并发正确性保障手段。同步是指在多线程并发访问共享数据时,保证共享数据在同一时刻只被一个线程使用(同一时刻,只有一个线程在操作共享数据)。而互斥是实现同步的一种手段,临界区、互斥量和信号量都是主要的互斥实现方式。因此,在这4个字里面,互斥是因,同步是果;互斥是方法,同步是目的。

  

  2、非阻塞同步。

  

  随着硬件指令集的发展,出现了基于冲突检测的乐观并发策略,通俗地说,就是先进行操作,如果没有其他线程争用共享数据,那操作就成功了;如果共享数据有争用,产生了冲突,那就再采用其他的补偿措施。(最常见的补偿错误就是不断地重试,直到成功为止),这种乐观的并发策略的许多实现都不需要把线程挂起,因此这种同步操作称为非阻塞同步。

  

  3、无需同步方案。

  

  要保证线程安全,并不是一定就要进行同步,两者没有因果关系。同步只是保证共享数据争用时的正确性的手段,如果一个方法本来就不涉及共享数据,那它自然就无需任何同步操作去保证正确性,因此会有一些代码天生就是线程安全的。

热心网友 时间:2022-04-01 14:01

不可变 在java语言中,不可变的对象一定是线程安全的,无论是对象的方法实现还是方法的...
2.绝对线程安全 绝对的线程安全完全满足Brian GoetZ给出的线程安全的定义,这个定义...
3.相对线程安全 相对线程安全就是我们通常意义上所讲的一个类是“线程安全”的。 它需要保证对...
4.线程兼容 线程兼容就是我们通常意义上所讲的一个类不是线程安全的。 线程兼容是指对象本身并...

热心网友 时间:2022-04-01 15:19

并发(concurrency)一个并不陌生的词,简单来说,就是cpu在同一时刻执行多个任务。
而Java并发则由多线程实现的。
在jvm的世界里,线程就像不相干的平行空间,串行在虚拟机中。(当然这是比较笼统的说法,线程之间是可以交互的,他们也不一定是串行。)
多线程的存在就是压榨cpu,提高程序性能,还能减少一定的设计复杂度(用现实的时间思维设计程序)。
这么说来似乎线程就是传说中的银弹了,可事实告诉我们真正的银弹并不存在。
多线程会引出很多难以避免的问题, 如死锁,脏数据,线程管理的额外开销,等等。更大大增加了程序设计的复杂度。
但他的优点依旧不可替代。

死锁和脏数据就是典型的线程安全问题。
简单来说,线程安全就是: 在多线程环境中,能永远保证程序的正确性。
只有存在共享数据时才需要考虑线程安全问题。
java内存区域:

其中, 方法区和堆就是主要的线程共享区域。那么就是说共享对象只可能是类的属性域或静态域。

了解了线程安全问题的一些基本概念后, 我们就来说说如何解决线程安全问题。我们来从一个简单的servlet示例来分析:public class ReqCounterServlet extends HttpServlet{ private int count = 0;
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
count++;
System.out.print("当前已达到的请求数为" + count);
}
public void doPost(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException { // ignore }
}1. 了解业务场景的线程模型
这里的线程模型指的是: 在该业务场景下, 可能出现的线程调用实况。
众所周知,Servlet是被设计为单实例,在请求进入tomcat后,由Connector建立连接,再讲请求分发给内部线程池中的Processor,
此时Servlet就处于一个多线程环境。即如果存在几个请求同时访问某个servlet,就可能会有几个线程同时访问该servlet对象。如图:

线程模型,如果简单的话,就在脑海模拟一下就好了,复杂的话就可以用纸笔或其他工具画出来。

2. 找出共享对象
这里的共享对象就很明显就是ReqCounterServlet。

3. 分析共享对象的不变性条件
不变性条件,这个名词是在契约式编程的概念中的。不变性条件保证类的状态在任何功能被执行后都保持在一个可接受的状态。
这里可以引申出, 不可变对象是线程安全的。(因为不可变对象就没有不变性条件)
不变性条件则主要由对可变状态的修改与访问构成。
这里的servlet很简单, 不变性条件大致可以归纳为: 每次请求进入时count计数必须加一,且计数必须正确。
在复杂的业务中, 类的不变性条件往往很难考虑周全。设计的世界是险恶的,只能小心谨慎,用测量去证明,最大程度地减少错误出现的几率。

4. 用特定的策略解决线程安全问题。
如何解决的确是该流程的重点。目前分三种方式解决:
第一种,修改线程模型。即不在线程之间共享该状态变量。一般这个改动比较大,需要量力而行。
第二种,将对象变为不可变对象。有时候实现不了。
第三种,就比较通用了,在访问状态变量时使用同步。 synchronized和Lock都可以实现同步。简单点说,就是在你修改或访问可变状态时加锁,独占对象,让其他线程进不来。
这也算是一种线程隔离的办法。(这种方式也有不少缺点,比如说死锁,性能问题等等)

其实有一种更好的办法,就是设计线程安全类。《代码大全》就有提过,问题解决得越早,花费的代价就越小。
是的,在设计时,就考虑线程安全问题会容易的多。
首先考虑该类是否会存在于多线程环境。如果不是,则不考虑线程安全。
然后考虑该类是否能设计为不可变对象,或者事实不可变对象。如果是,则不考虑线程安全
最后,根据流程来设计线程安全类。
设计线程安全类流程:
1、找出构成对象状态的所有变量。
2、找出约束状态变量的不变性条件。
3、建立对象状态的并发访问管理策略。

有两种常用的并发访问管理策略:
1、java监视器模式。 一直使用某一对象的锁来保护某状态。
2、线程安全委托。  将类的线程安全性委托给某个或多个线程安全的状态变量。(注意多个时,这些变量必须是彼此独立,且不存在相关联的不变性条件。)
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
支付宝买的基金怎么转到华泰证券? 为什么电磁炉上显示e0 抖音语音直播需要什么条件?怎么开语音直播? 农村拆迁宅基地赔多少钱 农村房屋拆迁多少钱每平米 农村宅基地拆迁赔钱怎么算 自然村,拆房补偿大概多少? 街头篮球和正式篮球比赛的区别是什么 标准篮球与街球规则的不同是什么 孩子降生用什么问候语好? 手机里的云服务怎么用? oppo手机里云服务是什么意思? 不懂编程怎么学app开发? 去哪里能学习APP应用开发? 如何从零开始学习app制作? 怎么进入云服务? 无任何基础,想学习怎样开发app请问我该从哪开始下手? 手机云服务是什么意思? 怎么学习App开发? 零基础学APP开发,如何自学开发APP 如何自学做一个APP? 想自学制作手机游戏APP,该怎么学? 一个小白,该如何学习app设计 章泽天身世背景曝光,为何没和刘强东离婚呢?你看她野心多大,怎么回事呢? 刘强东能把京东干这么大,要感谢15岁那年他穿着拖鞋离家出走,为什么? 刘强东案之被隐藏的秘密,你怎么看? 刘强东与前妻为何离? 刘强东有几段婚史 刘强东离婚了吗 刘强东卸任了京东集团的ceo,谁接任了这个职位? 蟋蟀喜欢吃什么? 蟋蟀吃什么东西好,蟋蟀喜欢吃什么 蛐蛐喜欢吃什么? 给蟋蟀吃什么最好 请问蟋蟀吃什么? 做梦梦见自己的姐姐光着身子我还亲她了 蟋蟀吃什么东西 梦见我姐相貌变得很漂亮了 蟋蟀吃什么?? 最近总梦到我姐姐 蟋蟀吃什么东西好 梦见姐姐变成疯子了! 蛐蛐吃什么食物 梦见喜欢的女孩变成了我的姐姐? 2021年5月7日梦见姐姐变成鬼加害我? 蟋蟀吃什么的? 梦见姐姐把我孩子的头剃成光的了 梦见前男友和我玩转眼变成姐姐 观音姐姐,我梦见我已经变成漂亮姐姐了,可老婆还是偷走仙丹而离去,为 ... 梦到和我姐做了几次,什么意思