关于list遍历时sychronizedList方法和synchronized同步块的线程安全问题思考

目录

    • 我的难点
      • sychronizedList方法无法解决List遍历时线程不安全问题
      • sychronizd同步块为什么可以解决List遍历时线程不安全问题
    • 我的思考过程

我的难点

sychronizedList方法无法解决List遍历时线程不安全问题

关于慕课网的socket课程学习中,qiujuer老师在课程中讲到:
关于多线程操作时,利用sychronizedList方法解决List内部方法线程不安全问题,但是对于list遍历仍然会触发异常。难点*1为什么会触发异常呢?

sychronizd同步块为什么可以解决List遍历时线程不安全问题

接着老师又讲到其他解决方案,
在stop()方法内部添加synchronized同步块。stop()方法中用到了List的遍历操作。
然后在boradcast(String str)方法名上添加sychronized修饰。方法内部用到了List的遍历操作。难点*2为什么同步块可以解决List遍历时线程不安全问题呢?

我的思考过程

难点*1:为什么会触发异常呢?
【思路】先看看sychronizedList(List list)是一个什么方法。
点开源码看看:这个方法支持特定的List返回一个线程安全的List。
【源码结论】:对于synchronizedList方法返回的List ,对该返回的List进行遍历时,必须放在同步块内部。否则可能导致非确定性(non-deterministic)问题。

待考证*1为什么线程安全的一个List,在进行遍历操作时会触发线程不安全?

【我的思考】:
非确定性(non-deterministic)问题指什么问题?它和线程不安全有什么关系呢?什么是线程不安全呢?
【我的理解】:

  1. 非确定性问题指无法直接计算,只能间接“猜算”结果的一类问题。
  2. 非确定性问题中可能会有线程不安全的问题出现。
  3. 线程不安全指:在多线程情况下,数据被先后更改多次导致脏数据。

【我的思考】:
源码讲到synchronizedList方法返回的List进行遍历操作时会有非确定问题,没有讲到线程不安全的问题。
【进一步思考】:
但是,源码建议这部分遍历要放到同步块中,说明synchronized同步块可以解决这部分的非确定问题,这部分问题主要是指线程不安全问题吗?同步块可以解决线程不安全问题吗?
【我的理解】:

  1. 这里的非确定问题主要指的是synchronizedList方法返回的List在遍历时导致线程不安全问题,因为必须使用同步块来解决这部分问题。
  2. 推测此处同步块可以解决线程不安全问题。

【我的思考】:
synchronizedList方法返回的List就是一个线程安全的list,所以遍历这个list会破坏了这个返回的list的的线程安全吗?
【我的理解】:

  1. 源码讲到返回的list在遍历时会出现非确定性问题,必须加上同步块。所以要看看使用同步块解决了什么问题。

难点*2为什么同步块可以解决List遍历时线程不安全问题呢?

思考:为什么遍历时线程会不安全呢?
未完待续。

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

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

相关文章

WinCE CEDDK之DMA相关函数

CEDDK提供了DMA的相关函数,在CEDDK/DDK_DMA/ddk_dma.c中定义。实际上里面最有用的就两个函数,HalAllocateCommonBuffer(..)和HalFreeCommonBuffer(..)分别用于为DMA申请和释放 首先介绍一下会用到的DMA适配器结构,在ceddk.h中定义,如下: type…

Navicat中无法自定义标量值函数的问题

目录自定义标量函数代码自定义函数无法创建问题自定义标量函数代码 我的思路:我要创建一个自定义标量函数。使用软件:navicat12.1版本。点击Fx图标进行创建。代码中,使用num作为入参,根据num的大小返回颜色。num大于0返回白色&am…

把十六进制字符转换成十进制数

2019独角兽企业重金招聘Python工程师标准>>> /*** Get the hex value of a character (base16).* param c A character between 0 and 9 or between A and F or* between a and f.* return An int between 0 and 15, or -1 if c was not a hex digit.*/public stat…

明白90/10的原理吗?

什么是90/10原理?即在您的一生中,只有10的事情您无能为力,而90的事情都在您的把握之中。 我们无法阻止汽车老化出故障,我们无法预料飞机晚点,我们的行程可能被司机耽误在路上,等等,这些都是我们…

SQL Server更新某一列中多个字典码对应内容(sql示例)

目录示例-查询出多个字典码对应的内容示例-替换多个字典码对应的内容说明CHARINDEXFOR XML PATH示例-查询出多个字典码对应的内容 建立表格:学生-学习科目表student_study 注意:科目kemu列内容是字典码,需要更换成对应内容。 建立表格&…

DirectX支配游戏!历代GPU架构全解析

http://tech.163.com/digi/10/0430/08/65GM21CJ001618J7.html转载于:https://www.cnblogs.com/qilinzi/archive/2010/06/23/1940494.html

mybatisPlus中的field-strategy(字段更新插入策略):null值插入和更新问题

目录mybatisPlus中null值插入和更新问题实际项目解决方法示例一实际项目解决方法示例二field-strategy字段更新插入策略介绍枚举类FieldStrategy源码枚举类字段简介mybatisPlus中null值插入和更新问题 配置mybatisPlus的项目中,默认进行了不是全量更新的策略&#…

javascript变量声明语法的应用和分号讲究适用性

变量声明语法:var变量名,通常应用在语句的代码当中。在语句ECMAScript中必须与关键字var变量名之间至少有一个空格。(也就是变量名需要遵守一定的规范,至少不应该出现中文;如出现中文那就使语法中的语句代码不能相应连接到有关系地对数据处理…

SQL Server和MysQL中的联表更新sql示例

目录需求说明SQL Server中联表更新sql示例MySQL中联表更新sql示例需求说明 需求说明:把表B的报名号数据,更新到另一张表A的报名号列。通过表A证件号码和表B身份证号相等。 SQL Server中联表更新sql示例 UPDATE a SET a.bmhb.bmh FROM A aINNER J…

Mybatis中(#{ })模糊查询like(使用oracle的concat函数嵌套拼接SQL)

需求: 模糊查询需要左右各拼接一个’%’,如:like %key% 。 项目情况: mybatis中动态传参一般采用占位符#{key}。使用数据库:orecle。 错误的尝试: 尝试使用: like % #{key} %这样写不起作用…

linux构建主从域名服务器

实验步骤:一、构建主域名服务器1、安装域名服务(BIND服务器软件包)BIND软件包是目前Linux下使用最广泛的DNS服务器安装包,它可以运行到大多数UNIX服务器中,也包括Linux系统。RHEL4默认没有安装BIND服务器软件包&#x…

HashMap的put方法(Java7)和putVal方法(Java8)

目录数组链表:存在性能最坏情况O(n)Java7的HashMap的put方法思路数组链表红黑树:性能提高到O(logn)Java8的HashMap的putVal方法思路数组链表:存在性能最坏情况O(n) Java8以前,HashMap底层数据结构采用数组链表的结构。 数组特点&…

管道过滤器(Pipe-And-Filter)模式

按照《POSA(面向模式的软件架构)》里的说法,管道过滤器(Pipe-And-Filter)应该属于架构模式,因为它通常决定了一个系统的基本架构。管道过滤器和生产流水线类似,在生产流水线上,原材料在流水线上经一道一道的…

Java创建对象的方式——反序列化创建对象

目录Java创建对象的几种方式反序列化创建对象思路代码示例Java创建对象的几种方式 Java创建对象的方式共有4种。分别为: 1、通过new语句实例化一个对象。 2、通过反射机制创建对象。 3、通过clone()方法创建一个对象。 4、通过反序列化的方式创建对象。 思考&#…

redis知识归纳

目录Redis有哪些数据结构?有大量key需要设置同一时间过期,需要注意什么?Redis分布式锁怎么回事?假设Redis里有1亿个key,其中有10万个key是以同一个固定前缀开头,如何将它们全部找出?如何用Redis…

PCI_Express规范第七章解读-Software Initialization and configuration

7.Software Initialization and configuration PCI EXPRESS Configuration model 支持两种配置空间的访问机制: -PCI 兼容配置机制:100%的二进制兼容PCI 2.3中定义的,以及兼容早期的OS或类似的总线枚举和配置软件。 -PCI Express增强配置机制…

List「Object[]」转Map「Integer,String」处理

题目 有一个List<Object[]>&#xff0c;里面的元素分别是[1,“a”]&#xff0c;[2,“b”]&#xff0c;[1,“c”]&#xff0c;[2,“d”]…&#xff0c;请写一个函数将其转换为一个Map<Integer,String>&#xff0c;以List的Object[]第一个元素为关键字&#xff0c;将…

Asp.net基础概念之 事件

.NET Framework中的事件 事件体系结构 引发事件的对象叫做事件源。事件源发布它可以引发的事件。事件的类型总是委托类型&#xff0c;这个委托类型的签名定义了处理该事件的方法的签名。定义事件处理程序方法的对象称为事件接收方。事件接收方预订要在事件源上处理的事件事件接…

synchronized同步方法概述

synchronized同步方法 1、“线程安全”与“非线程安全”&#xff1a; 非线程安全情况&#xff1a;多个线程对同一个对象中的实例变量进行并发访问时&#xff0c;产生脏读。 解决方法&#xff1a;对实例变量的值进行同步处理。 2、方法内的变量为线程安全 3、实例变量非线程安…

as3:sprite作为容器使用时,最好不要指定width,height

官方解释&#xff1a; 除 TextField 和 Video 对象以外&#xff0c;没有内容的显示对象&#xff08;如一个空的 Sprite&#xff09;的高度为 0&#xff0c;即使您尝试将 height 设置为其它值&#xff0c;也是这样。 如果您设置了 height 属性&#xff0c;则 scaleY 属性会相应调…