多线程的目的就是出现多个线程 一起执行 这种行为叫并发(并行出发的意思)
并发是好的初衷 但是 由于并发会使得并发中运行的多个线程出现访问同一个共享资源的情况
这样如果不采取措施 就会出现数据存取错误的情况
没有办法的情况下:出现了同步的概念 你可以这么理解
本来大家一起并行执行(理想结果)
但是:遇见共享数据之后 不能一起啦 (并发不行) 只能一个一个地执行(锁机制) 这样并行变成了串行 也就是同步机制
集合中的数据如果看成是共享资源的话:
线程访问到这个集合中的数据的话,如果集合内部的代码(java的源代码)有同步的机制, 则多个线程过来的时候,就要看一下锁是不是可用才能访问。
本来是并发执行的线程见到锁(同步)就不得不一个一个执行 显然 效率低了 但是 数据不会出错
有的集合源代码没有设置线程的同步机制 那么 多线程来的时候 就会随意的访问数据 而不用判断锁的情况(因为人家集合的源代码没有设置这个同步机制)
这样并发速度很快 但是 数据也不安全了
所以 毕老师说了 为了效率 最好用非同步机制的 在调用这个集合(看成共享资源)的代码由程序员自行加上锁 对线程进行同步管理
所以 访问数据的速度和访问数据的正确性是一对矛盾的问题 只能折中 不能都要 这样 你的代码里面 有的地方有同步 有的地方没有 没有的地方 就并发了
有的地方 就要一个一个地执行 好像行驶在宽阔的大马路上的五辆并行的轿车突然遇见一个只能允许一次只能通过一辆轿车的窄桥一样
肩并肩行驶的轿车只能按顺序通过窄桥 |