多线程,读写锁

问题描述

请教个问题,在多线程运用中,如果只加写锁,没有加读锁,那么在写的过程中,读线程可不可以读数据。

解决方案

解决方案二:
读线程可用.
解决方案三:
如果你不加读锁,那么就不会受到写锁的限制。也就是说读线程可以读数据。看下面我写的简单例子importjava.util.concurrent.locks.ReentrantReadWriteLock;importjava.util.concurrent.locks.Lock;publicclassTestReadWriteLock{publicstaticvoidmain(String[]args)throwsInterruptedException{ReadWriteDatarwd=newReadWriteData();ReadThreadrt=newReadThread(rwd);WriteThreadwt=newWriteThread(rwd);wt.start();Thread.sleep(2000);rt.start();}}classReadThreadextendsThread{privateReadWriteDatarwd;publicReadThread(ReadWriteDatarwd){this.rwd=rwd;}publicvoidrun(){System.out.println("result:"+rwd.getResult());}}classWriteThreadextendsThread{privateReadWriteDatarwd;publicWriteThread(ReadWriteDatarwd){this.rwd=rwd;}publicvoidrun(){rwd.setResult();}}classReadWriteData{privateReentrantReadWriteLockrwl=newReentrantReadWriteLock();privateLockreadLock=rwl.readLock();privateLockwriteLock=rwl.writeLock();privateinta=0;publicintgetResult(){//readLock.lock();try{System.out.println("ReadingStart...");returna;}finally{//readLock.unlock();}}publicvoidsetResult(){writeLock.lock();try{System.out.println("WritingStart...");Thread.sleep(10000);a++;System.out.println("WritingEnd...");}catch(InterruptedExceptione){}finally{writeLock.unlock();}}}

解决方案四:
引用2楼ok350350的回复:

如果你不加读锁,那么就不会受到写锁的限制。也就是说读线程可以读数据。看下面我写的简单例子importjava.util.concurrent.locks.ReentrantReadWriteLock;importjava.util.concurrent.locks.Lock;publicclassTestReadWriteLock{publicstaticvoidmain(String[]args)throwsInterruptedException{ReadWriteDatarwd=newReadWriteData();ReadThreadrt=newReadThread(rwd);WriteThreadwt=newWriteThread(rwd);wt.start();Thread.sleep(2000);rt.start();}}classReadThreadextendsThread{privateReadWriteDatarwd;publicReadThread(ReadWriteDatarwd){this.rwd=rwd;}publicvoidrun(){System.out.println("result:"+rwd.getResult());}}classWriteThreadextendsThread{privateReadWriteDatarwd;publicWriteThread(ReadWriteDatarwd){this.rwd=rwd;}publicvoidrun(){rwd.setResult();}}classReadWriteData{privateReentrantReadWriteLockrwl=newReentrantReadWriteLock();privateLockreadLock=rwl.readLock();privateLockwriteLock=rwl.writeLock();privateinta=0;publicintgetResult(){//readLock.lock();try{System.out.println("ReadingStart...");returna;}finally{//readLock.unlock();}}publicvoidsetResult(){writeLock.lock();try{System.out.println("WritingStart...");Thread.sleep(10000);a++;System.out.println("WritingEnd...");}catch(InterruptedExceptione){}finally{writeLock.unlock();}}}

回答的非常好
解决方案五:
如果你要读取两个变量或者以上的,或者线程不安全的集合或任何东西,那么读线程不加锁很可能会导致读出的数据之间不匹配,导致运算错误。危险!
解决方案六:
读写锁,读写互斥,写写互斥,读读不互斥。简单来讲,可以并发读取,但是,写入时不能读,不能同时写。
解决方案七:
引用5楼preferme的回复:

读写锁,读写互斥,写写互斥,读读不互斥。简单来讲,可以并发读取,但是,写入时不能读,不能同时写。

说的很好的。
解决方案八:
可以读,你用程序往记事本里写东西的时候你可以打开这个文件看内容的,程序就更不用说了能读。但是读的内容不全可能会有问题

时间: 2024-09-28 22:25:03

多线程,读写锁的相关文章

java多线程-读写锁原理_java

Java5 在 java.util.concurrent 包中已经包含了读写锁.尽管如此,我们还是应该了解其实现背后的原理. 读/写锁的 Java 实现(Read / Write Lock Java Implementation) 读/写锁的重入(Read / Write Lock Reentrance) 读锁重入(Read Reentrance) 写锁重入(Write Reentrance) 读锁升级到写锁(Read to Write Reentrance) 写锁降级到读锁(Write to

asp.net 多线程读写锁代码

c#中使用多线程同步是一个头痛的问题,比较经常用的是lock(object){}这种方法,但是这种方法在读多写少的时候比较浪费资源,当然c#也提供了一种读写锁,我这里只是提供一个原创读写锁的类的源代码,该类的主要目的是允许多个线程同时读,而仅允许一个线程写,而用lock是不论读写都只能一个线程运行的 有兴趣的可以看看讨论讨论,以下是源代码:     public sealed class MutilThreadReadWriterLock : IReadWriteLock,IDisposable

Java多线程编程中线程锁与读写锁的使用示例_java

线程锁LockLock  相当于 当前对象的 Synchronized import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /* * Lock lock = new ReentrantLock(); * lock.lock(); lock.unLock(); * 类似于 synchronized,但不能与synchronized 混用 */ public class Lo

C#使用读写锁三行代码简单解决多线程并发的问题_C#教程

在开发程序的过程中,难免少不了写入错误日志这个关键功能.实现这个功能,可以选择使用第三方日志插件,也可以选择使用数据库,还可以自己写个简单的方法把错误信息记录到日志文件. 选择最后一种方法实现的时候,若对文件操作与线程同步不熟悉,问题就有可能出现了,因为同一个文件并不允许多个线程同时写入,否则会提示"文件正在由另一进程使用,因此该进程无法访问此文件". 这是文件的并发写入问题,就需要用到线程同步.而微软也给线程同步提供了一些相关的类可以达到这样的目的,本文使用到的 System.Thr

java 读写锁详解

在java多线程中,为了提高效率有些共享资源允许同时进行多个读的操作,但只允许一个写的操作,比如一个文件,只要其内容不变可以让多个线程同时读,不必做排他的锁定,排他的锁定只有在写的时候需要,以保证别的线程不会看到数据不完整的文件.    下面是个关于多线程读写锁的例子,我稍微做了下修改,蛮容易理解的,来至于http://www.highya.com/redirect.php?fid=113&tid=7180&goto=nextoldset. 这里模拟了这样一个场景: 在ReadWriteL

java多线程的读写锁问题

问题描述 java多线程的读写锁问题 package cn.fans.chapter2.six; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; /** @author fcs @date 2015-4-12 描述:使用读写锁实现同步访问 说明:使用ReadWriteLock接口. */ public class PricesInf

java多线程:并发包中ReentrantReadWriteLock读写锁的锁降级模板

写锁降级为读锁,但读锁不可升级或降级为写锁. 锁降级是为了让当前线程感知到数据的变化. 1 //读写锁 2 private ReentrantReadWriteLock lock=new ReentrantReadWriteLock(); 3 //读锁 4 private ReadLock readLock=lock.readLock(); 5 //写锁 6 private WriteLock writeLock=lock.writeLock(); 7 private boolean updat

java多线程:并发包中ReentrantReadWriteLock读写锁的原理

一:读写锁解决的场景问题--->数据的读取频率远远大于写的频率的场景,就可以使用读写锁.二:读写锁的结构--->用state一个变量.将其转化成二进制,前16位为高位,标记读线程获取锁的次数.后16位为低位,标记写线程获取锁的次数.--->读写锁需要解决的冲突:读/写冲突,写/写冲突.读/读之间无冲突.--->当有写线程获取锁的时候.state的二进制表现,低位有数字,高位全是0.当有读线程获取锁的时候,state的二进制表现,低位全是0,高位有数字.--->如何获取读线获取

非一致性内存访问的读写锁

原文地址,译文地址,译者: 李杰聪,校对:郑旭东 原文作者: Irina Calciu         Brown University        irina@cs.brown.edu Dave Dice          Oracle Labs             dave.dice@oracle.com Yossi Lev           Oracle Labs             yossi.lev@oracle.com Victor Luchangco    Oracle