java多线程 arrayList线程安全和不安全

image.png

从上图可以看见Vector这个和ArrayList的源码很类似 都有一个Object数组 但是Vector里面有个synchronized修饰符 这个稍后理解
为了理解线程安全和不安全,我们需要对java里面的多线程做一个了解
首先介绍一个工具 是jdk自带的一个工具 通过这个工具可以很方便的看我们的应用程序里面的内存情况 ,cpu情况以及线程情况
首先在MyIndex里写入如下代码
使当前线程休眠100000毫秒 因为不休眠我们运行时程序一闪而过看不出效果


image.png

这时在我们编辑器里代码标红 alt+enter 选中第一项
在我们的main函数上加上了如下代码


image.png

即 throws InterruptedException
接下来先看下工具
image.png

在终端中输入Jvisualvm回车
出现如下界面
image.png

可以看见Visualvm和idea都在监控范围内 由于我们程序没有运行 所以看不见任何信息

接下来运行一下程序


image.png

可以看见我们多了运行程序的信息 看见了线程处MyIndex处于休眠状态
接下来我们学习下多线程是什么 关键部分如何编码 以及一旦我们进到多线程情况下 为什么Vector是线程安全的 ArrayList是线程不安全的
多线程编码
image.png

我们要实现多线程运行都要使用到Thread类 Thread类继承了runaable接口 里面有一个run方法是必须要实现的
所以我们可以猜出要么我们继承Thread类要么继承runnable接口 但是我们运行线程的时候必须使用Thread
接下来我们写一种常见的方式
在Core中创建一个java文件叫MyThread
在这个文件中我们继承Runaable接口实现run方法
代码如下
image.png

接下来来到MyIndex文件创建一个线程
image.png

以上代码就是创建一个线程 但是函数没有传入任何参数 没有任何意义
所以我们需要传入参数 但是参数传什么呢?
其实只要传入实现于Runnable接口的实现类就可以了
这里有两种方法
1.可以直接在MyIndex里面写入如下 如果业务比较简单 我们可以直接用内部类 new接口的形式实现
image.png

2.如果我们想独立的封装一些业务 也可以传入刚刚创建的MyThread类的实例对象


image.png

接下来演示下开5个线程分别执行一些事情
如何去执行呢?需要在run方法里写一些代码
image.png

运行结果
image.png

出现5个abc 这是由5个线程同时执行的 其实在cpu执行过程中也是有一些时间差的
以上即为多线程最简单的代码
下面我们来学习一线线程安全和不安全
首先创建个List
image.png

所谓的线程不安全 就是我们在执行的时候我们需要将ArrayList放入子线程中去执行 如果程序运行时只有一个线程 那么线程安全和不安全没什么区别 都是安全的 因为只有一个线程
接下来我们在执行的过程中将mylist传给子线程 让子线程去执行
这时我们需要对java按值传递还是引用传递有一些了解
我们将mylist传给子线程MyThread 在子线程或者方法中对mylist做一些修改 会影响原有的mylist 如果传递基本数据类型则不会
接下来如何传呢?
我们在MyThread里写入如下
image.png

然后再MyIndex里面子线程接收mylist参数
image.png

运行结果
image.png

image.png

点击多次运行结果不相同 这时我们的线程出现不安全的情况了
我们将MyThread里循环次数加大到200
代码如下
image.png

运行结果
同样出现线程不安全情况
同样我们可以给我们的线程命名看是哪个线程引起的问题
image.png

以上即为多线程对对象操作的时候产生的问题。这里最关键的问题是ArrayList里的add方法
会出现线程不安全是因为有可能执行一个线程的时候另外一个线程进入将值覆盖 或者进行插入操作 产生数组越界
为什么说Vector是线程安全的呢?
这是我们将MyIndex代码改为如下
image.png

MyThread代码 将循环次数加大到500
image.png

运行结果
image.png

运行多次 发现结果也不一样 但是比起ArrayList是不出现数组越界的错误了

但是结果为什么会不一样呢?
有可能我们的子线程没执行完就将输出结果打印出来了。
那么我们如何解决子线程执行完在执行主线程呢?


image.png

接下来演示一下代码
把上面的五个线程放入一个List集合里 这里我们写ArrayList是没有问题的 因为我们的代码没有变成多线程
这几句都是在主线程中执行的 不存在线程不安全
image.png

运行结果
image.png

不管运行多少次 结果都为2500 这是因为我们的输出结果在子线程执行结束后才运行的
是因为Vector源码的实现中有synchronized符 表示的是同步的 必须执行完才能执行别的进程
以上代码是用Vector接口实现的
但是我们如果就想用ArrayList怎么办呢?
这时我们要借助之前学习的工具类Collections(集合)来产生一个同步的ArrayList
image.png

运行结果
image.png

多次运行都是2500 上面改成同步List只是解决线程安全的一种方法
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容

  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 2,454评论 1 15
  • Java多线程学习 [-] 一扩展javalangThread类 二实现javalangRunnable接口 三T...
    影驰阅读 2,957评论 1 18
  • 事情是很好办成的,难的是满足人心。
    四筒0831阅读 196评论 0 0
  • 喝黑茶整整一百天了!! 从起初的不相信 不认可 到现在的 坚信 并且瘦了 十几斤 华莱黑茶真的是 谁喝谁知道!!...
    刘国梅阅读 204评论 0 0
  • 2017.4.6日 早上十点半滴滴去深圳宝安国际机场。飞机准点,1点起飞,3点半到达普吉国际机场。老公落地签,很快...
    陈龙英阅读 165评论 0 0