当前位置: 首页 > news >正文

网站建设 竞赛 方案网站制作模板程序

网站建设 竞赛 方案,网站制作模板程序,在线设计广告,企业网站推广的方法有?前言 金三银四 #xff1f; 也许#xff0c;但是。 近日#xff0c;又收到金三银四一线作战小队成员反馈的战况 #xff1a; 我不管你从哪里看的面经#xff0c;但是我不允许你看到我这篇文章之后#xff0c;还不清楚这个面试问题。 本篇内容预告#xff1a; Array…前言 金三银四 也许但是。 近日又收到金三银四一线作战小队成员反馈的战况 我不管你从哪里看的面经但是我不允许你看到我这篇文章之后还不清楚这个面试问题。 本篇内容预告   ArrayList 是线程不安全的 为什么 ① 结合代码去探一探所谓的不安全  ② 我们弄清楚为什么不安全结合源码以及我的个人讲述 ③ 不止步于为什么 我们得知道怎么办方案以及结合源码分析 ps:  这篇文章 注定篇幅很长 我会从非常非常小白0基础的角度去 很啰嗦地去讲一些内容。 距离上一次 这么臭长去讲 list集合相关的问题还是21年的时候 个人认为也是很有学习价值的大家也可以看看但是注意就是 别看着看着回不来了也是上万文字图片源码分析的文章: Java 移除List中的元素这玩意讲究 开整开整。 正文 看看它的不安全 以及 为什么不安全 线程不安全 看看官腔怎么说   线程不安全是指不提供加锁机制保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。 其实小白话就是 多线程操作的时候 容易出现与我们预想不一致的结果。 就比如说你做好准备 接我两拳。 本来你以为 我是打完一拳再打一拳。 结果我直接一招双龙出海两只手一起打你 你顶得住么你根本防不住。 开始结合代码一探究竟。 代码小栗子 ①   public static void main(String[] args) {int threadNum 1;ListString resultList new ArrayList();for (int i 0; i threadNum; i) {new Thread(() - resultList.add(UUID.randomUUID().toString())).start();}System.out.println(我们最终得到的resultList大小resultList.size());} 代码简析 大家猜想结果是多少   是 0 , 为什么不是 1 为什么会出现 0 不是往里面ADD 了一个元素么   如果说你对这个 0  的结果很意外的话 兄弟你完了。 吓你的你本来要完了还好你今天遇到了我。 对这个 0  的结果很意外代表你对线程方面的基础知识可能还没了解。 简析 因为for 里面 开了一个新的线程 new Thread 这个线程 负责往 list 里面 add 一个数据。 但是 我们的打印 list.size 是 主线程 也就是说如果 在 新的线程 new Thread 没执行完add 方法 主线程就执行打印的代码 那么就是 0啊 。 所以就是说我们 主线程 等一等让 for循环里面的新的线程 new Thread 先插入数据。 public static void main(String[] args) throws InterruptedException {int threadNum 1;ListString resultList new ArrayList();for (int i 0; i threadNum; i) {new Thread(() - resultList.add(UUID.randomUUID().toString())).start();}sleep(1000);System.out.println(我们最终得到的resultList大小resultList.size());} 可以看到结果是1了 接下来我们把线程数改成10另外主线程等5秒给足够的时间让这个10个线程好好竞争一下 我们来看看 所谓的不安全 的ArrayList 能出现什么 ‘不安全’ public static void main(String[] args) throws InterruptedException {int threadNum 10;ListString resultList new ArrayList();for (int i 0; i threadNum; i) {new Thread(()-{resultList.add(UUID.randomUUID().toString().substring(0,8));System.out.println(resultList);}).start();}sleep(5000);System.out.println(我们最终得到的resultList大小resultList.size());} 情况① 正常运行的情况可以看到 10个线程 不争不抢 显然这是不符合我们文章主题的我们要看的是不安全。 情况② 有竞争但是线程们 很友好所以也没出什么幺蛾子仅仅对于往list塞数据这个动作来说 情况③ 10个线程 显然还是 太少了 而且我电脑机子又好 终于出现 ‘不安全’情况了 非常难得。 多线程操作 ArrayList 导致出现 add赋值 出现 null  情景分析 为什么会出现先看看源码 Object[] elementData : 保存所有元素值的 数组 size : elementData中存储的元素个数 再看看 add 函数的 源码 ensureExplicitCapacity 函数 将当前的新元素加到列表后面判断列表的 elementData 数组的大小是否满足。 如果 size 1 的这个需求长度大于 elementData 这个数组的长度那么就要对这个数组进行扩容。 elementData[size] e e是传入的 值 把这个值 赋值在 elementData数组的 size 位置 。 大家看出来问题没 这两步没有和在一块操作。 也就说如果出现这个扩容的触发 和后面 赋值 并发情况 那么就有好戏看了。 ArrayList是基于数组实现数组大小一旦确定就无法更改。  ArrayList的扩容 将旧数组容器的元素拷贝到新大小的数组中(Arrays.copyOf函数)。 而 通过new ArrayList()实例的对象初始化的大小是0所以第一次插入就肯定会触发扩容。 这里又必须给大家推荐一篇好文章了 没错也是我写的但是看到这你别去看这篇跟着我现在的思路继续分析 这个null值出现的情景实在很感兴趣自己一会再看Java ArrayList new出来默认的容量到底是0还是10 看看我们的截图 第一个数据是 null 。 有趣。 第一个数据是 null 其实应该称为 执行扩容操作并发导致出现null值 分析 第一个线程A 插入数据时 属于首次add 发现需要扩容 ok 线程A 去扩容去了。 然后 我们是多线程操作场景 for循环第二次触发new第二个线程B来了线程B去add的时候 因为线程A第一次扩容可能并没完成,所以导致 线程B 扩容所拿到list的elementDate是旧的并不是线程A第一次扩容后对象 线程B 拿到的 size还是 0 所以线程B 也认为自己是第一次add 也需要扩容。 幻想一下 A 、B 线程的并发 一起进入扩容场景 那么线程A 是第一次add的时候他知道他要去扩容   他自己 扩容 完自己整了个list的新elementDate 然后 就开始赋值 elementDate[size] A的UUID值。 在线程A这个操作的过程中线程 B 在做什么 线程 B一开始 不巧也是以为要扩容他拿着一个旧的 list的elementDate 也整了一个新的数组 然后把 整个 list的 elementDate 引用指向 B线程自己弄出来的对象   this.elementData B新构建的对象这对象全部值为null 然后做什么 然后 线程B 开始执行   elementDate[size] B的UUID值。 这里的好玩点是什么 线程A 的值 赋值在 他创建出来的 elementDate 里面然后触发 size  。 但是线程 B 呢 把 this.elementData 指向了自己的新弄出来的 所以 A 的值 无情被抛弃 但是 线程 B 开始赋值的时候 看看这个size在源码里的情况 public class ArrayListE extends AbstractListEimplements ListE, RandomAccess, Cloneable, java.io.Serializable {transient Object[] elementData;//这是大家共用的 size private int size; } size是大家共用的 size 被 线程A 加1了 所以就出现 线程 B 赋值的时候   执行 elementDate[size] B的UUID值出来的结果是    [null , B的UUID值]  null 就是这么来的   能看到这的人友情提示你已经阅读了3500字。当然还没完事。 情况④ java.util.ConcurrentModificationException 并发冲突 直接定位报错函数 这个其实 之前分析过 modCount是修改记录数expectedModCount是期望修改记录数 初始化的时候 expectedModCountmodCount ArrayList的add函数、remove函数 操作都有对modCount操作当expectedModCount和modCount值不相等 那就会报并发错误了其实这个不是仅仅是多线程的问题是这个ArrayList 代码next函数的问题更多细节可以有空看看 Java 移除List中的元素这玩意讲究。  那么到这 我们大概知道 这个 ArrayList的不安全 问题了 说白了就是  2行代码没上锁操作。 怎么办 怎么安全起来 最简单的方式 也是面经上经常看到的  使用 Vector ListString resultList new Vector(); 看看vector怎么保证安全的 其次 是 使用 Collections里面的synchronizedList   ListString resultList Collections.synchronizedList(new ArrayList()); 看看synchronizedList 怎么保证安全的 还有可以使用 CopyOnWriteArrayList ListString resultList new CopyOnWriteArrayList(); 看看CopyOnWriteArrayList 怎么保证安全的 ps: CopyOnWriteArrayList 的set 也是上锁 但是get 没有 也就是说get可能在多线程场景使用拿到的是旧数据是可能的也就是当前能读到的list里面的数据 那么就CopyOnWriteArrayList的 set\add\get 函数你能预料到它的不好点么 1.set add 都选择使用了Arrays.copyOf复制操作  所以存在 内存占用以及耗时问题当数组元素越来越多的时候。 2. get 多线程过程读取数据不是实时那就可能出现 数据不一致问题但是最终数据是一致的读多写少就很合适。 好了该篇就到这吧。
文章转载自:
http://www.morning.rntby.cn.gov.cn.rntby.cn
http://www.morning.wrlcy.cn.gov.cn.wrlcy.cn
http://www.morning.htjwz.cn.gov.cn.htjwz.cn
http://www.morning.mmhyx.cn.gov.cn.mmhyx.cn
http://www.morning.tjwlp.cn.gov.cn.tjwlp.cn
http://www.morning.080203.cn.gov.cn.080203.cn
http://www.morning.krxzl.cn.gov.cn.krxzl.cn
http://www.morning.jjmrx.cn.gov.cn.jjmrx.cn
http://www.morning.dmldp.cn.gov.cn.dmldp.cn
http://www.morning.pmxw.cn.gov.cn.pmxw.cn
http://www.morning.daidudu.com.gov.cn.daidudu.com
http://www.morning.fcqlt.cn.gov.cn.fcqlt.cn
http://www.morning.gqryh.cn.gov.cn.gqryh.cn
http://www.morning.kntsd.cn.gov.cn.kntsd.cn
http://www.morning.ctqbc.cn.gov.cn.ctqbc.cn
http://www.morning.xgjhy.cn.gov.cn.xgjhy.cn
http://www.morning.ychoise.com.gov.cn.ychoise.com
http://www.morning.gcszn.cn.gov.cn.gcszn.cn
http://www.morning.ffksr.cn.gov.cn.ffksr.cn
http://www.morning.dkqbc.cn.gov.cn.dkqbc.cn
http://www.morning.dzyxr.cn.gov.cn.dzyxr.cn
http://www.morning.dqxnd.cn.gov.cn.dqxnd.cn
http://www.morning.lgmty.cn.gov.cn.lgmty.cn
http://www.morning.nqyzg.cn.gov.cn.nqyzg.cn
http://www.morning.jfzbk.cn.gov.cn.jfzbk.cn
http://www.morning.nckjk.cn.gov.cn.nckjk.cn
http://www.morning.dskmq.cn.gov.cn.dskmq.cn
http://www.morning.zstbc.cn.gov.cn.zstbc.cn
http://www.morning.kbdrq.cn.gov.cn.kbdrq.cn
http://www.morning.ywxln.cn.gov.cn.ywxln.cn
http://www.morning.mjjty.cn.gov.cn.mjjty.cn
http://www.morning.fqqlq.cn.gov.cn.fqqlq.cn
http://www.morning.wcjk.cn.gov.cn.wcjk.cn
http://www.morning.rttp.cn.gov.cn.rttp.cn
http://www.morning.smzr.cn.gov.cn.smzr.cn
http://www.morning.yktwr.cn.gov.cn.yktwr.cn
http://www.morning.pndw.cn.gov.cn.pndw.cn
http://www.morning.phjyb.cn.gov.cn.phjyb.cn
http://www.morning.nnpwg.cn.gov.cn.nnpwg.cn
http://www.morning.xsgxp.cn.gov.cn.xsgxp.cn
http://www.morning.prysb.cn.gov.cn.prysb.cn
http://www.morning.dxzcr.cn.gov.cn.dxzcr.cn
http://www.morning.zlzpz.cn.gov.cn.zlzpz.cn
http://www.morning.zycll.cn.gov.cn.zycll.cn
http://www.morning.qrnbs.cn.gov.cn.qrnbs.cn
http://www.morning.tmbfz.cn.gov.cn.tmbfz.cn
http://www.morning.yxzfl.cn.gov.cn.yxzfl.cn
http://www.morning.hnhsym.cn.gov.cn.hnhsym.cn
http://www.morning.elbae.cn.gov.cn.elbae.cn
http://www.morning.nccqs.cn.gov.cn.nccqs.cn
http://www.morning.pbbzn.cn.gov.cn.pbbzn.cn
http://www.morning.lqrpk.cn.gov.cn.lqrpk.cn
http://www.morning.rfxg.cn.gov.cn.rfxg.cn
http://www.morning.fpqsd.cn.gov.cn.fpqsd.cn
http://www.morning.hqnsf.cn.gov.cn.hqnsf.cn
http://www.morning.nlmm.cn.gov.cn.nlmm.cn
http://www.morning.ydrml.cn.gov.cn.ydrml.cn
http://www.morning.pxbrg.cn.gov.cn.pxbrg.cn
http://www.morning.qfwfj.cn.gov.cn.qfwfj.cn
http://www.morning.yzktr.cn.gov.cn.yzktr.cn
http://www.morning.rykx.cn.gov.cn.rykx.cn
http://www.morning.cnqff.cn.gov.cn.cnqff.cn
http://www.morning.nlwrg.cn.gov.cn.nlwrg.cn
http://www.morning.ntqgz.cn.gov.cn.ntqgz.cn
http://www.morning.dfbeer.com.gov.cn.dfbeer.com
http://www.morning.lztrt.cn.gov.cn.lztrt.cn
http://www.morning.dtnjr.cn.gov.cn.dtnjr.cn
http://www.morning.npbnc.cn.gov.cn.npbnc.cn
http://www.morning.fbhmn.cn.gov.cn.fbhmn.cn
http://www.morning.dblfl.cn.gov.cn.dblfl.cn
http://www.morning.qbdsx.cn.gov.cn.qbdsx.cn
http://www.morning.gfrjs.cn.gov.cn.gfrjs.cn
http://www.morning.nngq.cn.gov.cn.nngq.cn
http://www.morning.xjkfb.cn.gov.cn.xjkfb.cn
http://www.morning.hqzmz.cn.gov.cn.hqzmz.cn
http://www.morning.cmqrg.cn.gov.cn.cmqrg.cn
http://www.morning.kgxyd.cn.gov.cn.kgxyd.cn
http://www.morning.srtw.cn.gov.cn.srtw.cn
http://www.morning.pszw.cn.gov.cn.pszw.cn
http://www.morning.lgmgn.cn.gov.cn.lgmgn.cn
http://www.tj-hxxt.cn/news/270351.html

相关文章:

  • 做网站图片素材在线编辑福州大型网站建设
  • 网站上传的流程百度获客平台
  • 做网站超链接越秀手机建网站
  • 毕设做网站的过程wordpress静态设置方法
  • 网站淘宝客 没备案怎么做番禺网站建设a2345
  • 耒阳网站开发怎样营销网站建设
  • 理财网站建设方案书WordPress登录插件哪个好
  • 网站建设合同中英文模板商业性质网站建设步骤
  • 教育学校网站建设免费加盟游戏代理
  • 广州制作网站平台阳东城乡规划建设局网站
  • 嘉兴做网站seo的php的网站怎么做的
  • 兰山区网站建设推广怎么注册公司域名邮箱
  • wordpress tag转专题seo和网站建设那个先学
  • 企业做网站排名电商平面设计工作内容
  • 贵州省安顺市网站建设中国摄影师个人网站设计
  • 企业高端网站建设大连 找人做网站
  • 网站流量10g徐州哪有做网站的
  • ps怎么艺术字字体设计网站企业做的网站推广方案的步骤
  • 养老院为什么要建设网站做英文的小说网站有哪些
  • 外贸网站的推广方法产品推广策划案
  • seo网站排名优化培训教程英国有哪些做折扣的网站有哪些
  • 网站排名必做阶段性seo策略wordpress 跳转
  • 有没有做家纺类的网站临沂网站建设哪家好
  • 类模板模板下载网站有哪些怎么自己建一个网站吗
  • 哪些网站用php免费网站在哪里申请表
  • 深圳高端网站建设怎么样绥化网站建设
  • 网站建设的利润率多少华容网站
  • 做网站开发学什么郑州做网站公司有多少
  • 上海网站建设哪家公司好天津工程信息网
  • 做家教中介 不建网站怎么做wordpress花园主题