【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(同步监视器){ //需要访问的共享数据 } 

同步监视器:俗称“锁”,可以使用任意对象充当,但是确保多个线程持有同一把锁(同一个对象)


而若使用synchronized方法

public synchronized void show()//隐式的锁—this{} 


线程间接相互制约(如共享某些系统资源,I/O设备等)称为互斥,线程直接相互制约,如一个线程的结果才能使另一个线程工作,或像上面举例的两个线程共享资源称为同步。


好饿。



0 0