JAVA多线程(2)

来源:互联网 发布:淘宝是网站吗 编辑:程序博客网 时间:2024/05/18 06:23

在上一篇博客中,提到了一个火车售票的问题,但其实还有一个问题没有考虑到。比如一个售票点正在售票,并且此时只剩最后一张票了,但还没有对库存的票进行减一,这个时候另一个售票点又来了一个人要买票,售票员一查还有一张票,于是又卖了出去。这样最后一张票就被卖了两次。

 

实际情况中当然要避免这样的情况,于是就要想一个办法让那么多个线程访问同一个资源时一次只能有一个线程占有这个资源,当一个线程占有该资源时,另一个线程无法占有此资源。

 

JAVA中每一个类都有一个锁旗标,线程可以占有锁旗标,线程结束后又可以自动释放锁旗标,用法如下:

synchronized(对象){

代码

}

这样,在执行括号内代码时,可以使用对象,并且在执行这些代码的时候,这个对象会被锁死,其他线程无法占用。在代码执行完毕后,锁旗标会自动释放,这时这个对象又处于可用状态。

 

也可以在对象内将需要互斥的方法前面加上synchronized进行修饰,然后在线程中调用方法,也可以达到互斥的效果。

 

synchronized包含的代码段中,可以调用wait()notify()notifyAll()三个方法。

wait()的作用是释放对象的锁旗标,并且使该线程暂停并进入等待池。这个线程一直要等待其它线程调用notify()方法或notifyAll()方法后才能重新获得锁旗标并从wait()之后的语句开始执行。

notify()可以唤醒等待池中的一个线程。当等待池中有多个线程时,将会随机选择一个线程唤醒(等待池的数据结构既不是栈也不是队列,这一点很坑爹,之后多线程打印ABC中会说到)

notifyAll()可以唤醒所有线程,具有最高优先级的会被首先唤醒并执行。

0 0
原创粉丝点击