美文网首页
关于Java读写锁的一些理解和疑问

关于Java读写锁的一些理解和疑问

作者: 孙大硕 | 来源:发表于2019-11-07 11:02 被阅读0次

    在我们用线程安全的集合时搜用过CopyOnWriteArrayList,其原理是写时复制,也就是说写时操作的并不是原来的元素,而是将原来的元素copy一份,写完再赋值给原来的元素,而且在写的时候会加锁,也就是说同时只有一个线程可以写数据,当读数据的时候其实读的是老数据,读写已经分离了,所以互不影响。
    还有一种锁可以实现读写分离,就是读写锁ReadWriteLockReadWriteLock,分别有读锁和写锁,这个锁的特点是读-写互斥,写-写互斥,读-读共享,就是说当当读的时候不能写,当写的时候不能读,可以有多个线程同时读,但是同一时刻只能有一个线程写。

    看到这我就有一个问题,为什么要有读锁,读数据不会对数据源产生任何的更改,也不会有线程安全的问题。

    有网友说如果读的时候允许写,那同一时刻多个线程读的数据就不同,有些时候要求必须相同,这就需要读写锁了,读的时候不允许写,保证了数据的实时性。

    读写锁比较适合写少读多的情况,因为读可以并发。

    回到刚开始说的CopyOnWriteArrayList,没有读锁,当某一时刻多个线程正在读数据,但是有一个线程突然写好了数据,将原数据改变了,那就造成同一时刻读的数据可能不一致,所以实时性不强,而且写的时候复制造成了性能很差。所以只适合写少读多的情况。

    相关文章

      网友评论

          本文标题:关于Java读写锁的一些理解和疑问

          本文链接:https://www.haomeiwen.com/subject/qyymbctx.html