首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

读写锁小小结

2013-11-18 
读写锁小总结????lock.writeLock().lock()????System.out.println(Thread.currentThread().getName()+ :

读写锁小总结
????lock.writeLock().lock();
????System.out.println(Thread.currentThread().getName()+ ":Sleep begin."+getTime());
????// 休眠5秒
????sleepInSeconds(5);
????System.out.println(Thread.currentThread().getName()+ ":Sleep complete."+getTime());
????lock.writeLock().unlock();

???}
??}, "Thread-1").start();
??
??//此处休眠1秒,确保上面的代码得以先执行
??sleepInSeconds(2);

??new Thread(new Runnable()
??{

???@Override
???public void run()
???{
????System.out.println(Thread.currentThread().getName()+ " begin running."+getTime());
????lock.writeLock().lock();
????System.out.println(Thread.currentThread().getName()+ ":Sleep begin."+getTime());
????// 休眠2秒
????sleepInSeconds(5);
????System.out.println(Thread.currentThread().getName()+ ":Sleep complete."+getTime());
????lock.writeLock().unlock();
???}
??}, "Thread-2").start();
??
??//此处休眠1秒,确保上面的代码得以先执行
??sleepInSeconds(2);

??new Thread(new Runnable()
??{

???@Override
???public void run()
???{
????System.out.println(Thread.currentThread().getName()+ " begin running."+getTime());
????lock.readLock().lock();
????System.out.println(Thread.currentThread().getName()+ ":Sleep begin."+getTime());
????// 休眠2秒
????sleepInSeconds(5);
????System.out.println(Thread.currentThread().getName()+ ":Sleep complete."+getTime());
????lock.readLock().unlock();
???}
??}, "Thread-3").start();
?}

?/**
? * 休眠一定时间,单位5秒
? * @param seconds 要休眠的秒数
? */
?private static void sleepInSeconds(int seconds)
?{
??try
??{
???Thread.sleep(seconds * 1000);
??}
??catch (InterruptedException e)
??{
???e.printStackTrace();
??}
?}
?
?/**
? * 获取时间字符串
? * @return
? */
?private static String getTime()
?{
??return " Time:"+(System.currentTimeMillis() - beginTime)/1000;
?}

}

Thread-1 begin running. Time:0
Thread-1:Sleep begin. Time:0
Thread-2 begin running. Time:2
Thread-3 begin running. Time:4
Thread-1:Sleep complete. Time:5
Thread-2:Sleep begin. Time:5
Thread-2:Sleep complete. Time:10
Thread-3:Sleep begin. Time:10
Thread-3:Sleep complete. Time:15

?

?

从实验结果来看,Thread-1,Thread-2,Thread-3的代码已经按照原先设计在分别在0秒,2秒,4秒的时刻被调用,但是其lock部分的代码却是:Thread-1的lock代码先执行,Thread-1执行完了才执行Thread-2的lock代码,Thread-2执行完了才执行Thread-3的lock代码。

?

之前猜想的Thread-3的lock代码先于Thread-2的lock代码执行的情况没有出现,也就是说虽然当前正在执行的代码是readLock的代码,但如果存在一个writeLock排队,那么其它readLock是无法与当前正在执行的readLock并行执行的。

?

欢迎拍砖

热点排行