锁
2016-02-01 11:00
197 查看
1.内部锁
每个Java对象都可以隐式地扮演一个用于同步的锁的角色,这些内置的锁被称为内部锁或监视器锁。
获取锁:获取内部锁的唯一途径是,进入这个内部锁保护的同步块或方法。
退出锁:无论通过正常控制路径退出,还是从块中抛出异常,线程都在放弃对synchronized块的控制是自动释放锁。
2.互斥锁
内部锁在Java中扮演了互斥锁(mutex)的角色,意味着至多只有一个线程可以拥有锁,当线程A尝试请求一个呗线程B占有的锁时,线程A必须等待或者阻塞,直到B释放它。如果B永远不释放锁,A将永远等下去。
由同一个对象锁保护的不同代码块,不会被同时执行。
sd
每个Java对象都可以隐式地扮演一个用于同步的锁的角色,这些内置的锁被称为内部锁或监视器锁。
获取锁:获取内部锁的唯一途径是,进入这个内部锁保护的同步块或方法。
退出锁:无论通过正常控制路径退出,还是从块中抛出异常,线程都在放弃对synchronized块的控制是自动释放锁。
2.互斥锁
内部锁在Java中扮演了互斥锁(mutex)的角色,意味着至多只有一个线程可以拥有锁,当线程A尝试请求一个呗线程B占有的锁时,线程A必须等待或者阻塞,直到B释放它。如果B永远不释放锁,A将永远等下去。
由同一个对象锁保护的不同代码块,不会被同时执行。
//由同一个对象锁保护的不同代码块,不会被同时执行。 public class Example4 { final static Object o = new Object(); public class Task implements Runnable{ @Override public void run() { for (int i = 0; i < 100; i++) { //在开始到结束之间不会插入其他操作 synchronized (o) { System.out.println("开始+sleep"); try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("结束+sleep"); } //在开始到结束之间不会插入其他操作 synchronized (o) { System.out.println("开始-sleep"); try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("结束-sleep"); } } } } public static void main(String[] args) { Example4.Task task = new Example4().new Task(); for (int i = 0; i < 10; i++) { new Thread(task).start(); } } }
sd
相关文章推荐
- 进度条的写法
- 博客园添加访问人数统计
- commonJS — 浏览器操作(for Browser)
- zz一个失败的复旦学生的奋斗生涯
- Android中SwipeBack实现右滑返回效果
- 移植opencv到龙芯1c上
- js数组和字符串去重复几种方法
- 【Linux学习009】脚本编程之变量、条件测试和条件判断
- python中的实例方法、静态方法、类方法、类变量和实例变量浅析
- SBT和Git 使用代理
- Nginx笔记
- 样本筛选与特征处理
- 域名与IP地址的联系与区别
- make源码包安装
- people cmm 成熟度演变
- 第21章 线程局部存储
- commonJS — 数组操作(for Array)
- Activity 启动过程
- Android 开发的一些坑
- Matplotlib 生成不同大小的subplots