【面向对象设计基础】监视器

作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/

1)使用场景:一个对象可能要访问共享资源来完成它所要提供的服务,在多线程情况下,多个这样的对象在一起就会产生意想不到的后果,比如竞争。监视器就是在这样的一个对象上设置一个锁,以保证在给定时间内,只有一个线程可以执行这个对象上的任何一个方法。

2)例子:我们创建一个日志记录的类

public class FileLogger {
    public synchronized void log(String msg) {
       DataOutputStream dos = null;
       try {
             dos = new DataOutputStream(
             new FileOutputStream("log.txt”,true));
             dos.writeBytes(msg);
             dos.close();
       } catch (FileNotFoundException ex) {
             //
          }
       catch (IOException ex) {
         //
       }
   }
}

当一个线程执行到一个对象的同步方法时,它就得到这个对象的一个锁,在这个方法执行时这个线程就持有这个锁知道方法运行结束,期间其他线程无法拿到这个锁,也就无法执行这个方法了。当然同步方法是以运行速度开销作为代价的。

作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/

原文地址:https://www.cnblogs.com/gnuhpc/p/2822395.html