目录

  • 我的难点
    • 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遍历时线程不安全问题呢?

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

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

  1. java基础提升篇:synchronized同步块和volatile同步变量

    初遇 Java语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量.这两种机制的提出都是为了实现代码线程的安全性.其中 Volatile 变量的同步性较差(但有时它更简单并且开销更低 ...

  2. synchronized同步块和volatile同步变量

    Java语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量.这两种机制的提出都是为了实现代码线程的安全性.其中 Volatile 变量的同步性较差(但有时它更简单并且开销更低),而 ...

  3. Java中synchronized同步块的执行流程

    必要知识 Java 对象的数据结构 在 HotSpot 虚拟机中,Java 对象在内存中存储的布局可以分为 3 块区域:对象头(Header).实例数据(Instance Data)和对齐填充(Pad ...

  4. synchronized为什么能解决线程安全问题?

    synchronized在英语中翻译成同步,同步想必大家都不陌生.例如同步调用,有A,B两个方法,必须要先调用A并且获得A的返回值才能去调用B,也就是说,想做下一步,必须要拿到上一步的返回值. 同样的 ...

  5. Java多线程编程——线程同步与线程安全问题及synchronized关键字

    在多线程环境下,我们常常需要让多个线程同时去操作同一资源.在某些情况下,这种情形会导致程序的运行结果出现差错.专业上的,当多个线程在执行同一段代码的时候,每次的执行结果和单线程执行的结果都是一样的,不 ...

  6. 浅谈Java多线程同步机制之同步块(方法)——synchronized

    在多线程访问的时候,同一时刻只能有一个线程能够用 synchronized 修饰的方法或者代码块,解决了资源共享.下面代码示意三个窗口购5张火车票: 1 package com.jikexueyuan ...

  7. java每一个小时同步_Java同步块(synchronized block)使用详解

    Java 同步块(synchronized block)用来标记方法或者代码块是同步的.Java同步块用来避免竞争.本文介绍以下内容: Java同步关键字(synchronzied) 实例方法同步 静 ...

  8. 【线程同步】 Java 同步块(synchronized)详细说明

    我们在java开发中常常用synchronized( 互斥锁)来进行同步,但是对于 synchronized关键字有那些用法,会产生什么样的效果却不一定清楚,下面将详细介绍synchronized在程 ...

  9. 并发基础篇(六):线程Thread类的start()方法和run()方法

    点个赞,看一看,好习惯!本文 GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了 3 个月总结的一线大厂 Java 面试总结,本 ...

最新文章

  1. flask 获取网址
  2. 高等数学-微分方程知识点
  3. 软件构造的视图与质量指标
  4. cocos工程里面“”invalid ''cobl” in fuction xxx原理与解决方案
  5. 电脑教程从入门到精通_如何自学原画设计|新手如何开始学原画?(附视频教程从入门到精通)...
  6. 转:A/B测试:实现方法
  7. go语言api源码中文版_Go语言学习——sync.map源码剖析
  8. mac 二进制安装mysql_在mac下安装mysql二进制分发版的方法(不是dmg的)
  9. Nginx基本数据结构之ngx_list_t
  10. C程序中对时间的处理——time库函数详解转
  11. Tomcat 学习过程4
  12. Inno Setup入门(三)——指定压缩方式
  13. MySQL 计算字段长度函数LENGTH()与CHAR_LENGTH()
  14. vue项目通讯录_vue组件--通讯录
  15. LDC1314 学习资料
  16. 三键蓝牙音箱方案-DLT8M04S-杰力科创
  17. 帝国cms 留言反馈 问题
  18. python数字2大写汉字转换(金额转换)
  19. 基于新浪云的微信公众号开发配置过程
  20. 云创冬日紫金山踏雪游记

热门文章

  1. 关于MapReduce单词统计的例子:
  2. 【踩坑速记】开源日历控件,顺便全面解析开源库打包发布到Bintray/Jcenter全过程(新),让开源更简单~...
  3. 《小强升职记》读后感和思维导图
  4. Speerio Skinergy 'Image' is ambiguous 错误
  5. python的重点_python知识点
  6. 多麦克风做拾音的波束_麦克风丨人声应该用动圈话筒还是电容话筒?
  7. Java并发编程之synchronized关键字解析
  8. Linux删除文件和文件夹【命令】
  9. jQuery Mobile弹出对话框后不刷新原页面,保持原页面内容不变
  10. sqllite事务和MySQL事务_Android学习---SQLite数据库的增删改查和事务(transaction)调用...