免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1121 | 回复: 0
打印 上一主题 下一主题

解决共享资源的冲突 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-07-21 09:02 |只看该作者 |倒序浏览
实际上所有的多线程架构都采用串行访问的方式来解决共享资源的冲突问题。也就是说,同一时刻只有一个线程可以访问这个共享资源。通常是这样实现的,在代码的前后设一条加锁和解锁的语句,这样同一时刻只有一个线程能够执行这段代码。由于锁定语句会产生"互斥(mutual exclusion)"的效果,因此这一机制通常也被称为mutex。
解决共享资源的冲突
实际上所有的多线程架构都采用串行访问的方式来解决共享资源的冲突问题。也就是说,同一时刻只有一个线程可以访问这个共享资源。通常是这样实现的,在代码的前后设一条加锁和解锁的语句,这样同一时刻只有一个线程能够执行这段代码。由于锁定语句会产生"互斥(mutual exclusion)"的效果,因此这一机制通常也被称为mutex。
就拿你们家的浴室打比方;浴室(共享资源)要供很多人(线程)使用,而且每个人用的时候都是独占的。要用浴室之前,先要敲门,看看里面是不是有人。如果每人,就进去把门锁上。这样其它要用浴室的线程,就被堵在门外了,于是它必须等在门外,直到浴室的门重新打开。
等我们讲到浴室的门打开,另一个线程进去换走原先那个线程的时候,这个比方就有些不贴切了。实际上等在外面的线程并没有排成一列,相反由于线程的调度机制是非决定性的,因此谁都不知道谁会是下一个。这些线程更像是在围着浴室的门绕圈,当浴室的门开的那一刹那,最靠近门的那个线程会挤进去换走原来的那个。前面已经讲过了,我们可以用yield( )和setPriority( )来给线程调度机制提一些建议,但究竟能起多大作用,还要看平台和JVM。
Java提供了内置的防止资源冲突的解决方案,这就是synchronized关键词。它的工作原理很像Semaphore类:当线程想执行由synchronized看护的代码时,它会先检查其semaphore是否可得,如果是,它会先获取semaphore,再执行代码,用完之后再释放semaphore。但是和我们写的Semaphore不同,synchronized是语言内置的,因此不会有什么问题。
通常共享资源就是一段内存,其表现形式就是对象,不过也可以是文件,I/O端口或打印机之类的。要想控制对共享资源的访问,先把它放进对象里面。然后把所有要访问这个资源的方法都作成synchronized的。也就是说,只要有一个线程还在调用synchronized方法,其它线程就不允许访问所有的synchronized方法。
通常你会把类的成员设成private的,然后用方法进行访问,因此你可以把方法做成synchronized。下面就是synchronized方法的声明:
[color="#0000ff"]synchronized [color="#0000ff"]void f() { [color="#009900"]/* ... */ }
[color="#0000ff"]synchronized [color="#0000ff"]void g(){ [color="#009900"]/* ... */ }
每个对象都有一个锁(也称监控器monitor),它是对象生来就有的东西(因此你不必为此写任何代码)。当你调用synchronized方法时,这个对象就被锁住了。在方法返回并且解锁之前,谁也不能调用同一个对象的其它synchronized方法。就说上面那两个方法,如果你调用了f( ),那么在f( )返回并且解锁之前,你是不能调用同一个对象的g( )的。因此对任何一个特定的对象,所有的synchronized方法都会共享一个锁,而这个锁能防止两个或两个以上线程同时读写一块共用内存。
一个线程能多次获得对象的锁。也就是说,一个synchronized方法调用了另一个synchronized方法,而后者又调用了另一synchronized方法,诸如此类。JVM会跟踪对象被上锁的次数。如果对象没有被锁住,那么它的计数器应该为零。当线程第一次获得对象的锁时,计数器为一。线程每获一次对象的锁,计数器就加一。当然,只有第一次获得对象锁的线程才能多次获得锁。线程每退出一个synchronized方法,计数器就减一。等减到零了,对象也就解锁了,这时其它线程就可以使用这个对象了。
此外每个类还有一个锁(它属于类的Class对象),这样当类的synchronized static方法读取static数据的时候,就不会相互干扰了。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/7810/showart_36843.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP