线程同步

来源:互联网 发布:随身带着淘宝到异界 编辑:程序博客网 时间:2024/05/22 00:07

线程,最重要的功能是实现多任务处理,即多线程。在主线程上多个线程在逻辑上“同时”执行,而无需理会是否在物理上的“同时”执行。由此带来线程调度、同步的问题。

一、线程的同步,synchronized,简单地说,几个人要进入一间房间,房间里有临界资源,那些线程要访问的资源,整个房间就一 个临界区。人就是线程,在进房间前需要判断房间有没有上锁,有就等,没有则可以进入。人进去后,把门上锁,外面的人只能等待里面的人出来。当出来时,可能是yield()临时暂停、join()谁调用谁就先执行,当前线程后执行、sleep()进入睡眠状态,于是唤醒了notify()一个,notifyAll()(唤醒一大堆,不知道谁会执行,看系统的时间片分配)其余的线程执行。

进入等待队列的线程,有些可能有较高的优先级,那它先执行的可能性就远远要大,就像有人有后台一样,有优势。但并不就是说优先级低的线程没有执行的机会。在系统时间片的轮转下、调度算法下,还是有点机会的。

java解决线程的同步的问题是用互斥锁的概念,即上面所述。用synchronized锁住对象,其余对象要等占有锁的对象执行完才能抢占资源。这又容易引起另一个问题,死锁。处于临界区的A想要同样处于临界区的B释放它所占有的资源,同时B又想要A的资源,双方互相处于等待的状态,就一直等咯。

 

二、因此又加了一个条件变量进行控制。A发现资源B处于忙碌状态,线程转为等待状态,等待释放资源并开锁,否则直接用,B转为忙碌状态。

 

三、在操作系统中,还有一个信号量机制实现线程同步。

1、当某一线程使用信号量机制来实现同一进程中各线程之间的同步时,线程创建私用信号量,属于特定进程所有,存放在应用程序的地址空间中。一旦发生私用信号量的占有者异常结束或正常结束但未释放私用信号量空间时,系统无法将它传送给下一个请求它的线程。

2、公用信号量,如名,公用,系统分配管理,未释放空间自动回收,系统通知下一个线程。

原创粉丝点击