读写锁原理 用一个全局的boolean值做标志,在线程写资源之前判断boolean值,如为true(代表没有线程执行写操作),则把boolean值置为false,写完之后置为true,读资源不受限制。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 写完之后不能置为true,因为因为有其它线程可能正在读,我参考写了一个如下package com.yinzhaohui.container.sequance;/** * Created on 2004-7-25 Create author yinzhaohui */public class ReadWriteLock{ //最大写等待线程数(如为n表于,当有n个写等待线程时那么不再允许读线读只有等到写线程写了后读线程才会写的)是用于写优先的方式 private long maxWritersWaiting = 1; private boolean writingInProgress = false; //当前是否在写中 private long writersWaiting = 0; //当前等待的写线程数 private long readers = 0; //当前读线程数 public static ReadWriteLock CreateReadWriteLock(long maxWritersWaiting) { ReadWriteLock readWriteLock = new ReadWriteLock(); readWriteLock.maxWritersWaiting=maxWritersWaiting; return readWriteLock; } //获取读锁 public synchronized void getReadLock() { while (writingInProgress || (writersWaiting >= maxWritersWaiting)) { try { wait(); } catch (InterruptedException ie) { } } readers++; } //获取写锁 public synchronized void getWriteLock() { writersWaiting++; while ((readers > 0) || writingInProgress) { try { wait(); } catch (InterruptedException ie) { } } writersWaiting--; writingInProgress = true; } //释放读销 public synchronized void releaseReadLock() { readers--; if ((readers == 0) && (writersWaiting > 0)) { notifyAll(); } } //释放写销 public synchronized void releaseWriteLock() { writingInProgress = false; notifyAll(); } /** * 静态方法 * @param readWriteLock */ public static void acquireReadLock(ReadWriteLock readWriteLock) { readWriteLock.getReadLock(); } public static void acquireWriteLock(ReadWriteLock readWriteLock) { readWriteLock.getWriteLock(); } public static void destoryReadLock(ReadWriteLock readWriteLock) { readWriteLock.releaseReadLock(); } public static void destoryWriteLock(ReadWriteLock readWriteLock) { readWriteLock.releaseWriteLock(); } } 就是操作系统中的P、V操作呀,呵, satangf(好好学习,天天向上!) 的办法应该是可行的。 最易懂的办法public class Lock{ public Lock(){}}public class aaa{ Lock l = new Lock(); ... synchronized(l){ 同步操作... } ...} nhk_csdn(我呢) 你这样会行吗? 没有问题,我试过多次了,很方便,只要保证Lock实例化一次就可以了 如何判断一系列数字是否有序 nio 接收信息的时候说java.io.IOException: 您的主机中的软件放弃了一个已建立的连接 java 多线程例子问题 如何分析class的依赖关系 关于表格大小问题 简单问题 来参考一下! 在java中怎么向串口发送回车符号? 一个小问题 我使用jcreator编辑java 程序,却不能正确的显示结果,为什么? 关于手写输入 synchronized放在哪里? 为什么在多线程的程序中经常要写try{} catch(){}语句呢?
package com.yinzhaohui.container.sequance;/**
* Created on 2004-7-25 Create author yinzhaohui
*/
public class ReadWriteLock
{
//最大写等待线程数(如为n表于,当有n个写等待线程时那么不再允许读线读只有等到写线程写了后读线程才会写的)是用于写优先的方式
private long maxWritersWaiting = 1;
private boolean writingInProgress = false; //当前是否在写中
private long writersWaiting = 0; //当前等待的写线程数
private long readers = 0; //当前读线程数 public static ReadWriteLock CreateReadWriteLock(long maxWritersWaiting)
{
ReadWriteLock readWriteLock = new ReadWriteLock();
readWriteLock.maxWritersWaiting=maxWritersWaiting;
return readWriteLock;
}
//获取读锁
public synchronized void getReadLock()
{
while (writingInProgress || (writersWaiting >= maxWritersWaiting))
{
try
{
wait();
}
catch (InterruptedException ie)
{
}
}
readers++;
} //获取写锁
public synchronized void getWriteLock()
{
writersWaiting++;
while ((readers > 0) || writingInProgress)
{
try
{
wait();
}
catch (InterruptedException ie)
{
}
}
writersWaiting--;
writingInProgress = true;
} //释放读销
public synchronized void releaseReadLock()
{
readers--;
if ((readers == 0) && (writersWaiting > 0))
{
notifyAll();
}
}
//释放写销
public synchronized void releaseWriteLock()
{
writingInProgress = false;
notifyAll();
}
/**
* 静态方法
* @param readWriteLock
*/
public static void acquireReadLock(ReadWriteLock readWriteLock)
{
readWriteLock.getReadLock();
}
public static void acquireWriteLock(ReadWriteLock readWriteLock)
{
readWriteLock.getWriteLock();
}
public static void destoryReadLock(ReadWriteLock readWriteLock)
{
readWriteLock.releaseReadLock();
}
public static void destoryWriteLock(ReadWriteLock readWriteLock)
{
readWriteLock.releaseWriteLock();
}
}
呵, satangf(好好学习,天天向上!) 的办法应该是可行的。
public class Lock{
public Lock(){}
}public class aaa{
Lock l = new Lock();
...
synchronized(l){
同步操作...
}
...
}