【Java学习笔记】15:线程的共享互斥
来源:互联网 发布:php curl抓取网页数据 编辑:程序博客网 时间:2024/04/29 12:24
在多个线程里,因为多个线程可自由操作,就可能同时操作到同一实例,这种时候可能就会出现不协调的问题。比如两种途径同时操作统一银行账户里的钱,或者同一个售票处的多个窗口同时售票。
以取款为例,步骤上可以分成“确认可用余额”和“减去可用余额”两个操作,由于时间差,线程B可能会夹线程A的“确认可用余额”和“减去可用余额”这两个处理之间的情况。
这时需要一种管制的机制来防止这类问题发生,即当某个线程在执行某个部分时,限制其他线程不执行这部分。
*synchronized方法
package day15;public class Bank {private int money;private String name;public Bank(String name,int money){this.name=name;this.money=money;}//存款public synchronized void deposit(int m){money+=m;}//取款public synchronized boolean withdraw(int m){if(money>=m){money-=m;return true;//已取款}elsereturn false;//余额不足}public String getName(){return name;}}
如果给方法加上了synchronized声明,它就是同步方法了,一个实例的synchronized方法一次只能允许一个线程执行。如在上面的例子中,假如存在一个Bank实例,线程A在执行它的deposit()方法(属于synchronized方法),则线程B既不能执行它的deposit()方法,也不能执行它的withdraw()方法,因为这两个都是同一线程的synchronized方法,也就是将它们锁定(acquire)了,当执行synchronized方法的线程结束执行该方法后,锁定即被释放(release)。非synchronized方法就没有这样的限制。
*synchronized阻挡
synchronized(同步监视器){ //需要访问的共享数据 }
同步监视器:俗称“锁”,可以使用任意对象充当,但是确保多个线程持有同一把锁(同一个对象)
public synchronized void show()//隐式的锁—this{}
线程间接相互制约(如共享某些系统资源,I/O设备等)称为互斥,线程直接相互制约,如一个线程的结果才能使另一个线程工作,或像上面举例的两个线程共享资源称为同步。
好饿。
0 0
- 【Java学习笔记】15:线程的共享互斥
- 线程的共享互斥
- Java线程学习笔记(三)---线程同步互斥
- 线程间的资源互斥共享
- 共享数据的线程互斥
- java 多线程学习笔记之 线程互斥
- Java线程的互斥
- Java线程的互斥
- Java多线程设计(二)线程的基本知识(2)共享互斥
- JAVA并发编程学习笔记之AQS源码分析(共享与互斥)
- JAVA并发编程学习笔记之AQS源码分析(共享与互斥)
- JAVA并发编程学习笔记之AQS源码分析(共享与互斥)(r)
- 使用ACE互斥,同步线程共享的数据资源
- 关于线程间共享数据互斥的思考
- Java 线程互斥
- Java 线程互斥
- java多线程(二)线程的互斥
- java线程间的互斥
- Linux下搭建vsftp服务器、java、mysql、activemq、zookeeper、nginx、redis环境
- Java多线程/并发15、保持线程间的数据独立:ThreadLocal应用
- FZU1019 猫捉老鼠 (BFS)
- 利用百度地图API实现百度地图坐标拾取
- ACM 扫雷
- 【Java学习笔记】15:线程的共享互斥
- JS实现迷你日历
- c语言二进制、八进制、十六进制
- Cannot open include file: ‘config-win.h’: No such file or director 错误记录
- Unity Mono异常崩溃Assertion at mini-arm.c:2634, condition `pdata.found == 1' not met
- 排序算法-冒泡排序
- 游标例子
- char 、 unsigned char 互相转化
- 前端基础进阶(十):面向对象实战之封装拖拽对象