Lock锁住的是什么
2016-04-12 12:28
337 查看
通常lock对象都是final的,它锁住的是mLock.lock()和mLock.unlock()之间的代码块。也就是说所有使用了同一mLock对象的锁块之间是互斥的。
如上代码段,注释掉两个mLock.lock(),执行结果如下:
线程是交替执行的,如果代码区内有共享内容,将会出现线程安全问题。
有锁的情况下,执行结果如下:
不会同时访问锁块之间的内容。
当使用公平锁——mLock =new ReentrantLock(true),执行结果如下:
ReentrantLock(重入锁)以及公平性
《Java并发编程从入门到精通》显示锁Lock和ReentrantLock
import java.util.concurrent.locks.ReentrantLock; public class LockTest{ public static void main(String[] args){ final ReentrantLock mLock = new ReentrantLock(); Thread t = new Thread(){ public void run(){ for(int i = 0; i < 3; i++){ try{ mLock.lock(); System.out.println("thread 2 running i = " + i + " start"); sleep(3000); System.out.println("thread 2 running i = " + i + " end"); }catch(Exception e){ }finally{ mLock.unlock(); } } } }; t.start(); for(int i = 0; i < 3; i++){ try{ mLock.lock(); System.out.println("thread main running i = " + i + " start"); Thread.sleep(2000); System.out.println("thread main running i = " + i + " end"); }catch(Exception e){ }finally{ mLock.unlock(); } } } }
如上代码段,注释掉两个mLock.lock(),执行结果如下:
thread main running i = 0 start thread 2 running i = 0 start thread main running i = 0 end thread main running i = 1 start thread 2 running i = 0 end thread 2 running i = 1 start thread main running i = 1 end thread main running i = 2 start thread 2 running i = 1 end thread 2 running i = 2 start thread main running i = 2 end thread 2 running i = 2 end
线程是交替执行的,如果代码区内有共享内容,将会出现线程安全问题。
有锁的情况下,执行结果如下:
thread main running i = 0 start thread main running i = 0 end thread main running i = 1 start thread main running i = 1 end thread main running i = 2 start thread main running i = 2 end thread 2 running i = 0 start thread 2 running i = 0 end thread 2 running i = 1 start thread 2 running i = 1 end thread 2 running i = 2 start thread 2 running i = 2 end
不会同时访问锁块之间的内容。
当使用公平锁——mLock =new ReentrantLock(true),执行结果如下:
thread main running i = 0 start thread main running i = 0 end thread 2 running i = 0 start thread 2 running i = 0 end thread main running i = 1 start thread main running i = 1 end thread 2 running i = 1 start thread 2 running i = 1 end thread main running i = 2 start thread main running i = 2 end thread 2 running i = 2 start thread 2 running i = 2 end
ReentrantLock(重入锁)以及公平性
《Java并发编程从入门到精通》显示锁Lock和ReentrantLock
相关文章推荐
- 接口调试方法
- iOS中break、continue、return三者的区别
- ImageLoader介绍2
- 关于Apple Pay开发流程
- 图像编码中的小白问题sps ,pps ,nalu ,frame ,silce ect....
- 二维码生成(字符串)
- 并行计算机系统与结构模型(一)
- Viewpager自动无线轮播
- [LeetCode] Transpose File 转置文件
- IOS的UI基础01
- 最大值最小值
- 大气压、绝压、表压、真空度认识与理解
- Glide使用详解(一)
- mysql 死锁问题
- Glide使用详解(一)
- 编程知识汇总--3D模型文件的通用格式:FBX
- mysql 死锁问题
- mysql 死锁问题
- 【机器学习】数据处理中白化Whitening的作用图解分析
- wxpython ImportError: DLL load failed: 找不到指定的模块