如何使用java的锁机制
答案:2 悬赏:0 手机版
解决时间 2021-01-25 04:38
- 提问者网友:辞取
- 2021-01-24 18:45
如何使用java的锁机制
最佳答案
- 五星知识达人网友:罪歌
- 2021-01-24 19:23
可以在临界区代码开始的位置执行Lock类的lock方法,为代码块加锁,而在临界区的出口使用相同Lock实例的unlock方法,释放临界区资源。
Demo2-12中,主线程先创建了一个lockTest对象test,然后将相同的test对象交给两个不同的线程执行。子线程1获取到了lock后,开始执行before sleep输出语句,遇到sleep后,线程1阻塞将会放弃执行权,这时线程2可以获取执行权,当线程2执行lock方法时,发现锁已经被别的线程获取,所以线程2阻塞等待lock的释放。线程1从sleep中被唤醒后,将继续执行after sleep语句,之后释放了锁,此时线程2从锁等待中被唤醒,执行临近区的内容,因此Demo2-12的输出是先线程1的两条语句,之后才输出线程2的两条语句。而Demo2-13在没有锁的保护下,程序无法保证先将线程1的两条语句输出后再执行线程2的输出,因此,Demo2-13的输出结果是交叉的。
Demo2-12中,主线程先创建了一个lockTest对象test,然后将相同的test对象交给两个不同的线程执行。子线程1获取到了lock后,开始执行before sleep输出语句,遇到sleep后,线程1阻塞将会放弃执行权,这时线程2可以获取执行权,当线程2执行lock方法时,发现锁已经被别的线程获取,所以线程2阻塞等待lock的释放。线程1从sleep中被唤醒后,将继续执行after sleep语句,之后释放了锁,此时线程2从锁等待中被唤醒,执行临近区的内容,因此Demo2-12的输出是先线程1的两条语句,之后才输出线程2的两条语句。而Demo2-13在没有锁的保护下,程序无法保证先将线程1的两条语句输出后再执行线程2的输出,因此,Demo2-13的输出结果是交叉的。
全部回答
- 1楼网友:不甚了了
- 2021-01-24 20:48
多线程同步的实现最终依赖锁机制。我们可以想象某一共享资源是一间屋子,每个人都是一个线程。当a希望进入房间时,他必须获得门锁,一旦a获得门锁,他进去后就立刻将门锁上,于是b,c,d...就不得不在门外等待,直到a释放锁出来后,b,c,d...中的某一人抢到了该锁(具体抢法依赖于jvm的实现,可以先到先得,也可以随机挑选),然后进屋又将门锁上。这样,任一时刻最多有一人在屋内(使用共享资源)。 java语言规范内置了对多线程的支持。对于java程序来说,每一个对象实例都有一把“锁”,一旦某个线程获得了该锁,别的线程如果希望获得该锁,只能等待这个线程释放锁之后。获得锁的方法只有一个,就是synchronized关键字。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯