`
xussen
  • 浏览: 31468 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

MySimpleReadWriteLock

阅读更多
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.AbstractQueuedSynchronizer;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;


public class MySimpleReadWriteLock {

	private Syn syn = new Syn();
	private Lock readLock = new ReadLock(syn);
	private Lock writeLock = new WriteLock(syn);

	public MySimpleReadWriteLock() {
		
	}
	
	private static class ReadLock implements Lock {
		final private Syn syn;
		public ReadLock(Syn syn) {
			this.syn = syn;
		}
		@Override
		public void lock() {
			syn.acquireShared(1);
		}
		@Override
		public void lockInterruptibly() throws InterruptedException {
			syn.acquireInterruptibly(1);
		}
		@Override
		public boolean tryLock() {
			return syn.justTryAcquire(1);
		}
		@Override
		public boolean tryLock(long time, TimeUnit unit)
				throws InterruptedException {
			return syn.tryAcquireNanos(1, unit.toNanos(time));
		}
		@Override
		public void unlock() {
			syn.release(1);
		}
		@Override
		public Condition newCondition() {
			return syn.newCondition();
		}
	}
	
	private static class WriteLock implements Lock{
		private final Syn syn;
		public WriteLock(Syn syn) {
			this.syn = syn;
		}
		@Override
		public void lock() {
			syn.acquire(1);
		}
		@Override
		public void lockInterruptibly() throws InterruptedException {
			syn.acquireInterruptibly(1);
		}
		@Override
		public boolean tryLock() {
			return syn.justTryAcquire(1);
		}
		@Override
		public boolean tryLock(long time, TimeUnit unit)
				throws InterruptedException {
			return syn.tryAcquireNanos(1, unit.toNanos(time));
		}
		@Override
		public void unlock() {
			syn.release(1);
		}
		@Override
		public Condition newCondition() {
			return syn.newCondition();
		}
	}

	private static class Syn extends AbstractQueuedSynchronizer {

		private static final long serialVersionUID = 1L;
		private static final int SHARED_SHIFT = 16;
		private static final int SHARED_UNIT = 1 << SHARED_SHIFT;
		private static final int EXCLUSIVE_MASK = (1 << SHARED_SHIFT) - 1;
		private static final HoldCounterThreadLocal LOCAL = new HoldCounterThreadLocal();
		private HoldCounter holdCounter = null;
		
		private static class HoldCounterThreadLocal extends ThreadLocal<HoldCounter>{
			@Override
			protected MySimpleReadWriteLock.Syn.HoldCounter initialValue() {
				return new HoldCounter();
			}
		}
		
		private static class HoldCounter {
			int i = 0;
			long tid = Thread.currentThread().getId();
			public int decrement(int arg) {
				return i-=arg;
			}
			
			public int increment(int acquires) {
				return i+=acquires;
			}
		}

		@Override
		protected int tryAcquireShared(int acquires) {
			int state = super.getState();
			Thread current = Thread.currentThread();
			int exclusiveCount = exclusiveCount(state);
			if(exclusiveCount != 0 && current != getExclusiveOwnerThread()) {//current != getExclusiveOwnerThread()  保证写锁可以让读锁进
				return -1;
			}
			int c = state + (acquires<<SHARED_SHIFT);
			if(compareAndSetState(state, c)) {
				HoldCounter hc = holdCounter;
				if(hc == null || hc.tid != current.getId() ) {//holdCounter.tid != current.getId()  利用的底层的缓存,导致每个线程可能看到的holdCounter是不一样的,很有可能是自己的,也有可能是其他线程的
					holdCounter = hc = LOCAL.get();
				}
				hc.increment(acquires);
				return 1;
			}
			
			return -1;
		}
		private int exclusiveCount(int state) {
			return EXCLUSIVE_MASK & state;
		}

		@Override
		protected boolean tryReleaseShared(int arg) {
			Thread current = Thread.currentThread();
			HoldCounter hc = holdCounter;
			if(hc == null || hc.tid != current.getId()) {
				holdCounter = hc = LOCAL.get();
			}
			if(hc.i-arg < 0)
				throw new IllegalMonitorStateException("release arg is illegal");
			else 
				hc.decrement(arg);
			
			for(;;) {	//独占模式下的release不用for(;;) 因为只要判断了current和exclusiveOwnerThead就可以		 但是共享模式下的,由于release可能会并发执行,需要保证原子操作,就for和cas
				int state = getState();
				int nextc = state - (arg<<SHARED_SHIFT);
				if(compareAndSetState(state, nextc)) {
					return nextc == 0; 
				}
			}
		}

		@Override
		protected boolean tryAcquire(int acquires) {
			return justTryAcquire(acquires);
		}

		private boolean justTryAcquire(int acquires) {
			int state = super.getState();
			int w = exclusiveCount(state);
			Thread current = Thread.currentThread();
			if(state==0) {
				if(super.compareAndSetState(state, state+acquires)) {
					setExclusiveOwnerThread(current);
					return true;
				}
			} else if(w==0 || current!=getExclusiveOwnerThread()) {
				return false;
			} else {
				if(compareAndSetState(state, state+acquires)) {
					return true;
				}
			}
			return false;
		}

		@Override
		protected boolean tryRelease(int arg) {
			Thread current = Thread.currentThread();
			if(current!=getExclusiveOwnerThread()) {
				throw new IllegalMonitorStateException("release error");
			}
			int p = super.getState();
			int c = p-arg;
			if(c==0) {
				setState(c);
				setExclusiveOwnerThread(null);
				return true;
			} else {
				setState(c);
				return false;
			}
		}
		
		public Condition newCondition() {
			return new ConditionObject();
		}

		@Override
		protected boolean isHeldExclusively() {
			return getExclusiveOwnerThread() == Thread.currentThread();
		}
		
	}
	
	public Lock readLock() {
		return readLock;
	}
	
	public Lock writeLock() {
		return writeLock;
	}
	
	public boolean tryLock() {
		return syn.justTryAcquire(1);
	}
	
	public void lock() {
		syn.acquire(1);
	}
	
	public void unlock() {
		syn.release(1);
	}
	
}

 

import java.util.concurrent.locks.Lock;


public class MySimpleRWLockTest {
	static Lock readLock = null;
	static Lock writeLock = null;
	static {
		MySimpleReadWriteLock lock = new MySimpleReadWriteLock();
		readLock = lock.readLock();
		writeLock = lock.writeLock();
	}

	public static void main(String[] args) {
		writeLockTest();
		readLockTest();
	}

	private static void writeLockTest() {
		TestWorker worker = new TestWorker() {
			@Override
			public void exe() {
				System.out.println("..........start write ....");
				writeLock.lock();
				try {
					System.out.println("enter write ....");
					Thread.sleep(2000);
					System.out.println("exit write ....");
				} catch (Exception e) {
				} finally {
					writeLock.unlock();
				}
			}
		};
		worker.printTakeTimeMutil(2);
	}

	private static void readLockTest() {
		TestWorker worker = new TestWorker() {
			@Override
			public void exe() {
				System.out.println("..........start read ....");
				readLock.lock();
				try {
					System.out.println("enter read ....");
					Thread.sleep(1000);
					System.out.println("exit read ....");
				} catch (Exception e) {
				} finally {
					readLock.unlock();
				}
			}
		};
		worker.printTakeTimeMutil(5);
	}

}

..........start write ....

..........start read ....

enter write ....

..........start read ....

..........start write ....

..........start read ....

..........start read ....

..........start read ....

exit write ....

enter read ....

enter read ....

exit read ....

exit read ....

enter write ....

exit write ....

enter read ....

enter read ....

enter read ....

exit read ....

exit read ....

exit read ....

 

分享到:
评论

相关推荐

    毕业设计&课设_CUMT 信息安全专业毕业设计:基于区块链的能源交易系统,含架构、部署等多方面详细介绍.zip

    毕业设计&课设_CUMT 信息安全专业毕业设计:基于区块链的能源交易系统,含架构、部署等多方面详细介绍.zip

    用Python分析文本数据项目

    用Python分析文本数据项目

    基于SpringBoot的养老院管理系统源码数据库文档.zip

    基于SpringBoot的养老院管理系统源码数据库文档.zip

    AshampooUnInstaller v15.00.22 Portable一款强大的卸载工具,彻底、智能著称阿香婆强制卸载软件.rar

    阿香婆软件强制卸载软件 Ashampoo UnInstaller 是一款强大的卸载工具,彻底、智能著称,如果您选择使用Ashampoo安装程序,它会自动分析软件从开始安装到结束的全过程,并为该软件建立一个日志,以便以后更彻底的卸载它,Ashampoo UnInstaller 全面提速!程序采用了新的技术,速度得到了全面提高。Windows 默认应用现在也可以像其它无用程序和恶意软件一样被无忧卸载。摆脱工具栏、插件和其它隐藏的追踪软件,享受安全快捷的上网体验!新的快照比较功能,可以非常简单的创建安装日志,这是旧版本 UnInstaller 粉丝最急需的!新的界面,便捷的批量卸载,以及内置的在线搜索,Ashampoo UnInstaller 一定会让你惊叹无比。快来体验更清晰、更详尽、更快速的 Ashampoo UnInstaller !Ashampoo UnInstallerAshampoo UnInstaller彻底删除无用程序的所有痕迹! 让安装、试用、卸载程序更加轻松。只需点几下,无用的软件、浏览器扩展和工具栏就能从你的硬盘中

    基于java的公交车信息管理系统开题报告.docx

    基于java的公交车信息管理系统开题报告

    基于java的网络书店系统的开题报告.docx

    基于java的网络书店系统的开题报告

    forge-1.20.1-47.3.0-installer.jar

    forge-1.20.1-47.3.0-installer

    实例-文本进度条源代码

    python

    基于springboot云平台的信息安全攻防实训平台源码数据库文档.zip

    基于springboot云平台的信息安全攻防实训平台源码数据库文档.zip

    基于SpringBoot的房屋租赁系统源码数据库文档.zip

    基于SpringBoot的房屋租赁系统源码数据库文档.zip

    毕业设计&课设_家居物联网毕业设计项目:利用多种设备实现,含架构、目标.zip

    毕业设计&课设_家居物联网毕业设计项目:利用多种设备实现,含架构、目标.zip

    基于springboot的非学勿扰学习交流平台源码数据库文档.zip

    基于springboot的非学勿扰学习交流平台源码数据库文档.zip

    网络安全教程:基础知识到高级概念全面解读

    内容概要:本文详细介绍了网络安全领域的基础知识和高级概念,涵盖了网络安全概述、网络架构与协议、操作系统安全、网络攻击与防御、密码学与安全协议、身份认证与访问控制、系统漏洞与补丁管理、网络安全实践及发展趋势与挑战等内容。 适合人群:信息安全专业人员、IT运维人员、网络安全工程师、系统管理员。 使用场景及目标:本文不仅帮助读者理解网络安全的理论知识,还能指导实际操作,适用于日常网络安全管理和应急响应。目标在于增强个人和企业对网络安全的认识,提升防护能力。 其他说明:网络安全是一个不断发展变化的领域,文中提到的内容和技术应及时跟进最新的发展动态,确保网络安全的有效性。

    java毕设项目之基于SpringBoot的特殊儿童家长教育能力提升平台(源码+说明文档+mysql).zip

    环境说明:开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7 数据库工具:Navicat 开发软件:eclipse/myeclipse/idea Maven包:Maven 浏览器:谷歌浏览器。 项目经过测试均可完美运行

    精选微信小程序源码:仿京东白条小程序(含源码+源码导入视频教程&文档教程,亲测可用)

    微信小程序是一种轻量级的应用开发平台,主要针对移动端,由腾讯公司推出,旨在提供便捷的、无需下载安装即可使用的应用服务。"京东白条"是京东金融推出的一种信用消费产品,用户可以在京东商城购物时享受先消费后付款的便利。这款"微信小程序京东白条小程序源码"包含了实现这一功能的小程序源代码,以及相应的导入教程,对于开发者来说,是一个有价值的参考资料。 源码是程序开发的基础,它包含了开发者编写的控制程序行为的指令。在这个案例中,源码可能包括了与京东白条接口交互的逻辑,用户界面设计,以及数据处理等功能。通过分析这些源码,开发者可以学习如何集成京东的API,实现白条的查询、支付和管理等操作。 "源码导入视频教程"和"源码导入文档教程"是辅助开发者理解和使用源码的重要资料。视频教程通常以直观的方式展示源码的导入步骤和环境配置,帮助开发者快速上手。文档教程则可能包含了详细的步骤说明,解决常见问题的技巧,以及开发过程中的注意事项,对于初学者来说尤其有价值。 微信小程序的开发涉及到以下几个关键技术点: 1. **WXML(Weixin Markup Language)**:这是微信小程序的视图层语言,

    数字孪生赋能智慧城市大脑建设方案PPT(65页).pptx

    市大脑的基础平台是支撑其高效运行的关键。该平台通过整合电子政务网、视联网、互联网等多网资源,以及云计算、大数据、人工智能等先进技术,打造了一个统一、开放、可扩展的底层架构。在这个基础上,城市大脑能够接入海量数据,包括但不限于视频监控、交通流量、环境监测、民生服务等领域的实时数据,并进行高效处理和分析。这些数据经过清洗、转换、开发后,形成了丰富的数据资源池,为城市治理提供了坚实的数据支撑。 在数据资源的基础上,智慧城市大脑进一步构建了算法服务平台和融合业务应用系统。算法服务平台集成了多种先进的视频分析算法和人工智能算法,如人脸识别、车辆识别、城市问题智能识别等,这些算法能够实时分析视频流和数据流,快速识别城市运行中的问题和异常。同时,融合业务应用系统则将这些算法与城市治理的各个领域相结合,如交通、环保、旅游、医疗等,形成了多个具有实战价值的应用场景。例如,在交通领域,城市大脑能够通过实时分析交通流量和路况信息,优化信号灯控制策略,缓解交通拥堵;在环保领域,则能够实时监测空气质量和水质情况,及时预警环境污染事件。 数字驾驶舱是智慧城市大脑的又一亮点。它作为城市治理能力现代化的新抓手,实现了数据一屏展示、指标一屏分析、指挥一屏联动、场景一屏闭环和治理一屏透视。通过数字驾驶舱,决策者可以直观地看到城市运行的全貌,及时获取关键信息,做出准确的判断和决策。同时,数字驾驶舱还能够根据用户的需求进行个性化配置,提供多种数据处理和分析工具,帮助用户深入挖掘数据价值,提升城市治理的精细化和智能化水平。 智慧城市大脑的建设成效显著。它不仅提高了城市治理的效率和准确性,还带来了显著的社会效益和经济效益。通过优化资源配置、降低运营成本、提升服务质量等方式,智慧城市大脑为城市居民提供了更加便捷、高效、舒适的生活环境。同时,它也为城市的可持续发展注入了新的动力,推动了产业升级和经济转型。可以说,智慧城市大脑已经成为了未来城市发展的重要方向和趋势,它将引领我们走向一个更加智慧、绿色、宜居的城市新时代。 总的来说,智慧城市大脑是一个集数据、算法、应用为一体的综合性解决方案,它通过高度集成和智能分析,实现了城市治理的精细化和智能化。在未来的发展中,随着技术的不断进步和应用场景的不断拓展,智慧城市大脑将会发挥出更加巨大的潜力和价值,为城市的可持续发展和社会的全面进步做出更大的贡献。

    毕业设计&课设_景区购票系统(含更新情况、数据字典及多种语言实现).zip

    毕业设计&课设_景区购票系统(含更新情况、数据字典及多种语言实现).zip

    上传一个考研冲刺资源dssdf

    上传一个【考研冲刺】资源

    C0858 手机之家(1页).Zip

    C0858 手机之家(1页).Zip

Global site tag (gtag.js) - Google Analytics