精华内容
下载资源
问答
  • 那么原子是什么,静止是什么意思呢? 为什么在Java中没有其他类型的线程安全方法?“原子”是什么意思?当方法调用似乎立即生效时,该方法就是原子的。 因此,其他线程在方法调用之前或之后只能看到状态,而没有...

    “线程安全”实际上意味着什么?

    通过优锐课的学习分享,讨论了关于Java中的线程安全性意味着类的方法是原子的或静态的。 那么原子是什么,静止是什么意思呢? 为什么在Java中没有其他类型的线程安全方法?

    “原子”是什么意思?

    当方法调用似乎立即生效时,该方法就是原子的。 因此,其他线程在方法调用之前或之后只能看到状态,而没有中间状态。 让我们看一下非原子方法,看看原子方法如何使类具有线程安全性。

    public class UniqueIdNotAtomic {

    private volatile long counter = 0;

    public long nextId() {

    return counter++;

    }

    }

    类UniqueIdNotAtomic通过使用易失性变量计数器创建唯一的ID。 我在第2行使用了volatile字段,以确保线程始终看到当前值,如此处更详细的说明。 要查看此类是否是线程安全的,我们使用以下测试:

    public class TestUniqueIdNotAtomic {

    private final UniqueIdNotAtomic uniqueId = new UniqueIdNotAtomic();

    private long firstId;

    private long secondId;

    private void updateFirstId() {

    firstId = uniqueId.nextId();

    }

    private void updateSecondId() {

    secondId = uniqueId.nextId();

    }

    @Test

    public void testUniqueId() throws InterruptedException {

    try (AllInterleavings allInterleavings =

    new AllInterleavings("TestUniqueIdNotAtomic");) {

    while(allInterleavings.hasNext()) {

    Thread first = new Thread( () -> { updateFirstId(); } ) ;

    Thread second = new Thread( () -> { updateSecondId(); } ) ;

    first.start();

    second.start();

    first.join();

    second.join();

    assertTrue( firstId != secondId );

    }

    }

    }

    }

    为了测试计数器是否是线程安全的,我们需要在第16和17行中创建两个线程。我们启动这两个线程(第18和19行)。然后,我们等待直到两个线程都通过第20和21行结束。 在两个线程都停止之后,我们检查两个ID是否唯一,如第22行所示。

    为了测试所有线程交织,我们使用来自vmlens第15行的AllInterleavings类,将完整的测试放在while循环中迭代所有线程交织。

    运行测试,我们看到以下错误:

    java.lang.AssertionError:

    at org.junit.Assert.fail(Assert.java:91)

    at org.junit.Assert.assertTrue(Assert.java:43)

    发生该错误的原因是,由于操作++不是原子操作,因此两个线程可以覆盖另一个线程的结果。 我们可以在vmlens的报告中看到这一点:

    在发生错误的情况下,两个线程首先并行读取变量计数器。 然后,两个都创建相同的ID。 为了解决这个问题,我们通过使用同步块使方法原子化:

    private final Object LOCK = new Object();

    public long nextId() {

    synchronized(LOCK) {

    return counter++;

    }

    }

    现在,该方法是原子的。 同步块可确保其他线程无法看到该方法的中间状态。

    不访问共享状态的方法是自动原子的。 具有只读状态的类也是如此。 因此,无状态和不可变的类是实现线程安全类的简便方法。 他们所有的方法都是自动的。

    并非原子方法的所有用法都是自动线程安全的。 将多个原子方法组合为相同的值通常会导致争用条件。 让我们看看从ConcurrentHashMap获取和放置的原子方法以了解原因。 当以前的映射不存在时,让我们使用这些方法在映射中插入一个值:

    public class TestUpdateTwoAtomicMethods {

    public void update(ConcurrentHashMap map) {

    Integer result = map.get(1);

    if( result == null ) {

    map.put(1, 1);

    }

    else {

    map.put(1, result + 1 );

    }

    }

    @Test

    public void testUpdate() throws InterruptedException {

    try (AllInterleavings allInterleavings =

    new AllInterleavings("TestUpdateTwoAtomicMethods");) {

    while(allInterleavings.hasNext()) {

    final ConcurrentHashMap map =

    new ConcurrentHashMap();

    Thread first = new Thread( () -> { update(map); } ) ;

    Thread second = new Thread( () -> { update(map); } ) ;

    first.start();

    second.start();

    first.join();

    second.join();

    assertEquals( 2 , map.get(1).intValue() );

    }

    }

    }

    }

    该测试与先前的测试相似。 再次,我们使用两个线程来测试我们的方法是否是线程安全的(第18行和第19行)。再次,我们在两个线程完成之后测试结果是否正确(第24行)。运行测试,我们看到以下错误:

    java.lang.AssertionError: expected:<2> but was:<1>

    at org.junit.Assert.fail(Assert.java:91)

    at org.junit.Assert.failNotEquals(Assert.java:645)

    该错误的原因是,两种原子方法get和put的组合不是原子的。 因此,两个线程可以覆盖另一个线程的结果。 我们可以在vmlens的报告中看到这一点:

    在发生错误的情况下,两个线程首先并行获取值。 然后,两个都创建相同的值并将其放入地图中。 要解决这种竞争状况,我们需要使用一种方法而不是两种方法。 在我们的例子中,我们可以使用单个方法而不是两个方法get和put来进行计算:

    public void update() {

    map.compute(1, (key, value) -> {

    if (value == null) {

    return 1;

    }

    return value + 1;

    });

    }

    因为方法计算是原子的,所以这解决了竞争条件。 虽然对ConcurrentHashMap的相同元素进行的所有操作都是原子操作,但对整个地图(如大小)进行操作的操作都是静态的。 因此,让我们看看静态意味着什么。

    “静止”是什么意思?

    静态意味着当我们调用静态方法时,我们需要确保当前没有其他方法在运行。 下面的示例显示如何使用ConcurrentHashMap的静态方法大小:

    ConcurrentHashMap map =

    new ConcurrentHashMap();

    Thread first = new Thread(() -> { map.put(1,1);});

    Thread second = new Thread(() -> { map.put(2,2);});

    first.start();

    second.start();

    first.join();

    second.join();

    assertEquals( 2 , map.size());

    通过等待直到所有线程都使用线程连接完成为止,当我们调用方法大小时,我们确保没有其他线程正在访问ConcurrentHashMap。

    方法大小使用在java.util.concurrent.atomic.LongAdder,LongAccumulator,DoubleAdder和DoubleAccumulator类中也使用的一种机制来避免争用。 与其使用单个变量存储当前大小,不如使用数组。 不同的线程更新数组的不同部分,从而避免争用。 该算法在Striped64的Java文档中有更详细的说明。

    静态类和静态方法对于收集竞争激烈的统计数据很有用。 收集数据后,可以使用一个线程来评估收集的统计信息。

    为什么在Java中没有其他线程安全方法?

    在理论计算机科学中,线程安全性意味着数据结构满足正确性标准。 最常用的正确性标准是可线性化的,这意味着数据结构的方法是原子的。

    对于常见的数据结构,存在可证明的线性化并发数据结构,请参见Maurice Herlihy和Nir Shavit撰写的《多处理器编程的艺术》一书。 但是要使数据结构线性化,需要使用比较和交换之类的昂贵同步机制,请参阅论文《定律:无法消除并发算法中的昂贵同步》以了解更多信息。

    因此,研究了其他正确性标准(例如静态)。 因此,我认为问题不在于“为什么Java中没有其他类型的线程安全方法?” 但是,Java何时将提供其他类型的线程安全性?

    结论

    Java中的线程安全性意味着类的方法是原子的或静态的。 当方法调用似乎立即生效时,该方法就是原子的。 静态意味着当我们调用静态方法时,我们需要确保当前没有其他方法在运行。

    目前,静态方法仅用于收集统计信息,例如ConcurrentHashMap的大小。 对于所有其他用例,使用原子方法。 让我们拭目以待,未来是否会带来更多类型的线程安全方法。

    文章写道这里,如有不足之处,欢迎补充评论。

    如果你对java技术很感兴趣也可以一起交流学习,共同学习进步!

    2496cb43573163e906a5393dd99f4179.png

    最近get了很多新知识,希望能帮到大家。需要详细的java架构思维导图路线也可以评论获取!

    展开全文
  • 我们经常说线程安全线程安全,那么你对于线程安全意思真的是了解的吗?下面就让我们一起来深刻的理解一下java线程安全吧!一、什么是线程安全既然讲到线程安全的问题的话,那么,不用多说,基本上问题隐患都是出现在...

    我们经常说线程安全线程安全,那么你对于线程安全的意思真的是了解的吗?下面就让我们一起来深刻的理解一下java线程安全吧!

    一、什么是线程安全

    既然讲到线程安全的问题的话,那么,不用多说,基本上问题隐患都是出现在多个线程访问的情况下产生的。

    也就是说,确保在多条线程访问时,我们的程序还可以按照我们预期的行为去执行。

    下面一起来看一段代码:Integer count = 0;

    public void getCount()

    {

    count++;

    System.out.println(count);

    }

    这段代码是非常简单的,下面来统计一下这个方法的访问次数,多个线程同时访问会不会出现什么问题。

    在开启了3条线程,每一个线程循环10次,得到了下面的结果。

    0e46ebc60525520427bbc7b886708e74.png

    可以看出,这里的话,出现了2个26,那么为什么会出现这样的情况呢?

    这种情况的出现,很明显的表明了这个方法根本就不是线程安全的。

    最常见的导致这种情况出现的原因就是,A线程在进入方法之后,拿到了count的值,刚刚将这个值读取出来还没有改变count的值的时候,结果线程B也进来了,那么,就导致了线程A和线程B拿到的count值是相同的。

    由此,我们可以知道这个不是一个线程安全的类,因为,他们都需要操作这个共享的变量。

    实际上来说,要对线程安全问题给出一个明确的定义还是比较的复杂的,下面就根据这个程序,来对什么是线程安全进行一下总结。

    在多个线程访问某个方法的时候,不论你通过什么样的调用方式又或者是说这些线程怎样交替的执行,在主程序当中都不需要去做任何的同步,这样的类的结果行为都是我们设想的正确行为,那么我们就可以说这个类是线程安全的。

    以上的内容就是对于线程安全的一个简单解释了,你清楚了吗?

    更多java入门知识,请继续通过奇Q工具网来了解吧。

    推荐阅读:

    展开全文
  • 在建筑行业中,不同颜色的安全帽代表的意思也是不同的。今天给大家带来的是关于安全帽不同颜色的解读。安全帽,它是用来保护我们头部的钢制帽子。它的整体呈现的是半球形,具有一定的弹性抗冲击力,并且它本身十分的...

    在建筑行业中,不同颜色的安全帽代表的意思也是不同的。今天给大家带来的是关于安全帽不同颜色的解读。

    48389b122934daf99a331ed8023f740c.png

    安全帽,它是用来保护我们头部的钢制帽子。它的整体呈现的是半球形,具有一定的弹性抗冲击力,并且它本身十分的坚固,光滑。安全帽,它最大的特点就是它的透气性良好以及材质十分的轻巧。它应用的行业十分的广泛,除了在建筑行业外还大量的应用在冶金,林业等行业。

    安全帽颜色代表的是什么?

    安全帽可不是你喜欢什么颜色就能带什么颜色的。在工地上我们一般能看到四种不同颜色的安全帽,分别是:白色、红色、蓝色、黄色。

    3ce3456ec48ccaba4b813d5142245bfa.png

    白色的安全帽在工地上代表的是:监理方或者甲方(工地管理者)。他们主要是负责计划的实施以及工程质量的监管。

    6b2760f6deac498288f2a57f492615d7.png

    红色安全帽在工地上代表的是:技术人员或者我们的管理人员,其次甲方人员也是有带的。它的人员多是负责人,大家一定了解清楚哦!

    5416e71319a44817af409f7fcfc1df8b.png

    蓝色安全帽在工地上代表的是:技术人员。因此红蓝色安全帽是最难的分辨的,因此并没有特别的规定,一般不同的企业佩戴的不同。

    b4ef3c42da558ecf2b2f1fdcf5a1c745.png

    黄色安全帽在工地上代表的是:普通人员。相信这个大家都是知道的,我国建筑工地上一般工人都是佩戴黄色的安全帽。

    总结:不同颜色的安全帽是为了更好的分辨人员,以免造成不必要的麻烦。另外,安全帽在工地上是十分重要的,大家在进入工地的时候千万不要嫌麻烦而不戴安全帽。

    素材来源于网络

    展开全文
  • Mark一下我那可爱的儿子人生中第一次破...开水、电、火、横穿马路这类),孩子只要是想探索的,都可以让他们放心大胆的去尝试,现在反省完的结果就是,一些容易受伤的行为也要及时即止,比方说这次滑滑板车从坡上下来...

        Mark一下我那可爱的儿子人生中第一次破相,周日跟我去公园玩的时候摔了个狗吃屎,长大第一次受这么严重的伤,怪我儿子不听话,也挂我这个当妈的没负起照顾好孩子的责任,我反省了好久,本来我的育儿观念是:只要没有生命危险(例如:开水、电、火、横穿马路这类),孩子只要是想探索的,都可以让他们放心大胆的去尝试,现在反省完的结果就是,一些容易受伤的行为也要及时即止,比方说这次滑滑板车从坡上下来结果摔破了,哎,儿子摔完第一天,估计是被吓坏了,一整天都超级乖,还去上了学而思的数学课,课堂上做的特别端正,听的特别认真,晚上没有去上英语课,但是他说停课不停学,在家做了好多作业,还认真弹了钢琴,曾几何时,我就想要一个这样的孩子啊,这就是标准别人家孩子的样子嘛,可是我不想他被动变成这样,我想他主动变成这样,我还曾幻想着,经过这次的挫折,他说不定会脱胎换股的去改变一下自己呢,谁曾想,三四天以后,又变回了那个活蹦乱跳,叽叽喳喳,让我很无语的那个傻儿子,哎。。。只能安慰自己,儿子的天性就这样,无法改变。

           经过这次教训以后,我真的要看好孩子,不光嘴上要让他们注意安全,时时刻刻的要抓着他们,在安全的地方才能松手,养俩孩子真心不容易啊,今天还有同事跟我说,婷姐,你怎么有这么多白头发?感觉比我妈妈的还多,我说你妈就生了你一个,我生了俩,能不愁白头吗?

          在学校里,儿子也经历了一次挫折教育,老师和同学们也问他怎么回事,所有的人都关心他,让他以后注意安全,希望这次能够真真切切让他意识到安全的重要性。

          开学2个多月,第一次成为公众人物是在全班表演吹泡泡,还记得那是一次数学课,他上课不好好听讲,在座位上用口水吐泡泡,老师让他站起来,给全班表演一下,傻儿子居然听了老师的话,在全班面前吐泡泡,然后儿子还骄傲的跟我说,妈妈我吐完泡泡全班的小朋友都给我鼓掌了呢,还一副很自豪的表情,我滴个神。。。这孩子啥时候才能懂事啊?结果经过这次破相,老师还在全班把儿子作为案例,让大家知道注意安全的重要性,真是长脸了,全班同学和所有任课老师居然通过这种方式深深的记住了童皓然,怎么跟我预想的剧本完全不一样呢?我的剧本里可是希望他表现优秀,成绩拔尖让所有同学和老师认识他,结果真实的情况却是如此的不同。。。

           停更了好几天,主要也是一直在反省自己,明天开始继续更新。

    519260782b9f99d39a6e698f86cbe3d1.png

    c8bf3fddf488fd42e4bc1c39ef0d984e.png

    展开全文
  • 人的身体免疫力和抵抗力存在不同,所以在与病毒或是致病菌有效接触的情况下,造成的后果肯定会存在不同的答案。但不管怎么说,在与HPV病毒有效接触的情况下,...HPV病毒,就是所谓人乳头瘤病毒的缩写,这种病毒在有...
  • 二进制安全是指,在传输数据时,保证二进制数据的信息安全,也就是不被篡改、破译等,如果被攻击,能够及时检测出来。二进制安全包含了密码学的一些东西,比如加解密、签名等。举个例子,你把数据11110000加密成...
  • 那么原子是什么,静止是什么意思呢? 为什么在Java中没有其他类型的线程安全方法?“原子”是什么意思?当方法调用似乎立即生效时,该方法就是原子的。 因此,其他线程在方法调用之前或之后只能看到状态,而没有...
  • 线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。 线程不安全就是不提供数据...
  • ”“进火车站要转着圈找门,这是什么意思?”……近日,不断有市民向本报反映,称衡水火车站广场南口“铁将军”把门,给旅客进出带来困扰,记者对此展开调查。14日上午,记者来到衡水火车站。从中心街由南向北到站前...
  • 区块链能成为近年来科技发展的风口之一,很大程度源于比特币的传播普及。而比特币能从无人问津发展到现在的万亿市值,则离不开它自身对代码的开源...代码开源的意思就是任何人都可以审查、修改和增强源代码。事实上...
  • 解释1: 对于可执行程序,开发完毕后,有源码审核和二进制审核,所谓二进制安全是说程序经过了二进制审核,能够保证...二进制安全是指,在传输数据时,保证二进制数据的信息安全,也就是不被篡改、破译等,如果被攻
  • 所谓“摆渡”,现实中的摆渡就是在一条船从江河这一边到另一边,再从另一边到这一边。数据摆渡的过程也类似。为了防范网络攻击,通过物理隔离的思路,将两台完全不相连的计算机,通过软盘从一台计算机向另一台计算机...
  • 把系统的安全日志导出来了,其他的都知道,就是这一项,不知道指的什么意思 筛选器信息: 筛选器运行时ID: 层名称: 曾运行时ID:
  • 区块链能成为近年来科技发展的风口之一,很大程度源于比特币的传播普及。而比特币能从无人问津发展到现在的万亿市值,则离不开它自身对代码的开源...代码开源的意思就是任何人都可以审查、修改和增强源代码。事实上...
  • 有时,当您访问网站时,屏幕上会弹出警告,提示“证书被吊销”,这里的证书指的就是网站安全证书,也就是SSL证书。网站安全证书被吊销旨在警告用户有关不可信网站的信息,并保护用户免受欺诈和威胁。 引起网站...
  • 就是线程同步的意思就是当一个程序对一个线程安全的方法或者语句进行访问的时候,其他的不能再对他进行操作了,必须等到这次访问结束以后才能对这个线程安全的方法进行访问。 什么叫线程安全: 如果你的代码所在的...
  • PIN码在手机SIM卡中有很重要的作用,那么PIN码到底是什么意思呢?...2.PIN码全称是Personal Identification Number,翻译成中文就是个人识别密码,这是一种保护SIM卡的安全措施,主要作用就是防止别人盗用...
  • 当企业开始实施安全仪表系统(SIS)项目时,利益相关者必须做出的第一个决策就是选择系统架构。通过遵循国际网络安全标准(例如IEC 62443(ANSI/ISA 62443系列标准)以及国际过程工业自动化用户协会(NAMUR)指南等),使得...
  • python封装是什么意思发布时间:2020-09-21 09:17:42来源:亿速云阅读:97作者:Leahpython封装是什么意思?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决...
  • 简单来说就是提供一个对象的引用给作用域之外的代码。比如return一个对象,或者作为参数传递到其他类的方法中。什么是逸出?如果一个类还没有构造结束就已经提供给了外部代码一个对象引用即发布了该对象,此时叫做...
  • 什么是IDC?IDC数据中心什么意思

    万次阅读 2019-11-01 10:44:18
    作为一位从事网络工作者...IDC翻译过来的字面意思就是数据中心,它首要是为企业、媒体、网站供给大规模、高质量、安全可靠的互联网服务,首要包含:服务器托管、网站空间租用、带宽批发等业务。加上现在的idc服务商...
  • 区块链能成为近年来科技发展的风口之一,很大程度源于比特币的传播普及。而比特币能从无人问津发展到现在的万亿市值,则离不开它自身对代码的开源...代码开源的意思就是任何人都可以审查、修改和增强源代码。事实上...
  • 区块链能成为近年来科技发展的风口之一,很大程度源于比特币的传播普及。而比特币能从无人问津发展到现在的万亿市值,则离不开它自身对代码的开源...代码开源的意思就是任何人都可以审查、修改和增强源代码。事实上...
  • 就是在刹车过程中,通过电子仪器,系统能调节车轮制动力以防止车轮出现抱死的状况,...而ABS防抱死系统就是能更好的处理制动的稳定性从而保障乘客和驾驶员的安全。抱死的现象就是相当于车轮紧急制动完全处于静止不工...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 934
精华内容 373
关键字:

安全就是什么意思