JavaScript引入模块的历史
两个线程同时执行上面的remove方法,(「极端的情况」)都「可能」get到的是"",然后都去删除第0个元素,这个元素有可能已经被其它线程删除了,因此Vector不是绝对线程安全的。(上面这个案例只是做演示而已,在你的业务代码里面这么写的话,线程安全真的就不能靠Vector来保证了)。 通常情况下我们说的线程安全都是相对线程安全,相对线程安全只要求调用单个方法的时候不需要同步就可以得到正确的结果,但数多个方法组合调用的时候也是有可能导致多线程问题的。
如果想让上面的操作执行正确,我们需要在调用Vector方法的时候添加额外的同步操作: 借用网上的这张图,这张图描述的很清楚了,这里就不在啰嗦。 何为线程安全? 我们经常会听说某个类是线程安全,某个类不是线程安全的。那么究竟什么叫做线程安全呢? 我们引用《Java Concurrency in Practice》里面的定义: 在不使用额外同步的情况下,多个线程访问一个对象时,不论线程之间如何交替执行或者在调用方进行任何其它的协调操作,调用这个对象的行为都能得到正确的结果,那么这个对象是线程安全的。 也可以这么理解: 多个线程访问同一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他操作,调用这个对象的行为都可以获得正确的结果,那么这个对象就是线程安全的。或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。 可以简单的理解为:“你随便怎么调用,出了问题算我输”。 这个定义对于类来说是十分严格的,即使是Java API中标为线程安全的类也很难满足这个要求。
比如Vector是标记为线程安全的,但实际上并不能满足这个条件,举个例子: 协议 SD协议中,由于命令数据线和数据线是分开的,因此我们需要关注,命令的传输格式,以及数据的传输格式; 命令传输 命令以48位数据包的形式通过双向CMD引脚进行传输。 这些命令包包括命令索引,变量和CRC位。该命令始终通过主机发送,最终由SD卡接收。 回传的响应数据包也为48位。
整体命令如下图所示; (编辑:惠州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |