Java多线程系列(3)--解决共享资源竞争synchronized

来源:互联网 发布:直播软件xsplit 编辑:程序博客网 时间:2024/04/30 12:56

一、对于共享资源竞争的场景描述

 依据Java编程思想中所给出的例子:你坐在桌边手拿叉子,正要去叉盘子中的最后一片食物,当你的叉子就要够着它时,这片食物突然消失了,因为你的线程被挂起了,而另一个用餐者进入并吃掉了它。这正是编写并发程序时需要处理的问题。对于并发工作,你需要某种方式来防止两个任务访问相同的资源,至少在关键阶段不能出现这种情况。防止这种冲突的方法:当资源被一个任务使用时,在其上加锁。第一个访问某项资源的任务必须锁定这项资源,是其它任务在其被解锁之前,就无法访问它了,而在其被解锁时,另一个任务就可以锁定并使用它。基本上所有的并发模式在解决多线程冲突问题时,都是采用序列化访问共享资源的方案。意味着在给定时刻只允许一个任务访问共享资源。通常这是通过在代码前面加上一条锁语句实现的,这就使得在一段时间内只有一个任务可以运行这段代码。因为锁语句产生了一种互相排斥的效果,所以这种机制常常被称为互斥量。Java以提供关键字synchronized的形式,为防止资源冲突提供了内置支持,当任务要执行被synchronized关键字保护的代码片段时,它将检查锁是否可用,然后获取锁,执行代码,释放锁。

上面介绍的是Java编程思想中部分内容,在此列出,便于理解多线程中解决共享资源竞争的方法。

二、认识synchronized关键字三条使用原则:

(1)当一个线程访问某对象的synchronized方法或者synchronized代码块时,其它线程对这个对象的这个synchronized方法或者synchronized代码块的访问将被阻塞。

(2)当一个线程访问某对象的synchronized方法或者synchronized代码块时,其它线程仍然可以访问该对象的非同步代码块。

(3)当一个线程访问某对象的synchronized方法或者synchronized代码块时,其它线程对该对象的其它的synchronized方法或者synchronized代码块的访问将被阻塞。

0 0
原创粉丝点击