chapter04_对象的组合_2_实例封闭

  • 封闭

    (1) 封装简化了线程安全类的实现过程。将数据封装在对象内部, 可以将数据的访问限制在对象的方法上, 从而更容易确保线程在访问数据时总能持有正确的锁

    (2) 被封闭对象不能超出它们既定的作用域

    可以封闭在一个类实例中(private变量)

    可以封闭在某个作用域内(局部变量)

    封闭在线程内(只在同一个线程的不同方法内传递, 不在不同线程间传递)

  • 可以使用对象的内置锁this对内部的对象进行封闭, 但是用其他的锁也可以, 只要确保使用了同一个锁。

    对于不同的状态变量, 还可以使用不同的锁来增加灵活性

  • Java监视器模式

    (1) 将对象的所有可变状态都封装起来, 并由__对象的内置锁(synchronized)__保护

    (2) 示例

      public class PrivateLock {
    
          private final Object myLock = new Object();
    
          @GuardedBy("myLock")
          Widget widget;
    
          void someMethod() {
              synchronized (myLock) {
              // Access or modify the state of widget
              }
          }
    
          class Widget {
          }
      }
    

    myLock就是内置锁

    (3) 优点

    私有的锁可以将锁封装起来,使客户代码无法得到锁

  • 装饰器模式实现线程封闭

    一些基本的容器类例如ArrayList不是线程安全的, 但是可以使用装饰器模式__将容器类封装在一个同步的包装器对象中,而包装器将接口中的所有方法都实现为synchronized方法, 并将调用请求转发到底层的容器对象上__(例如Collections.synchronizedList)

      List<String> synchronizedList = Collections.synchronizedList(myList);
    

    使用的Collections.synchronizedList()方法的内部实现是这样的

      public static <T> List<T> synchronizedList(List<T> list) {
          return (list instanceof RandomAccess ?
              new SynchronizedRandomAccessList<>(list) :
              new SynchronizedList<>(list));
      }
    

    以SynchronizedList为例,它是Collections类的内部静态类,它的一些实现是这样的

      static class SynchronizedList<E> {
    
          final Object mutex;
          final List<E> list;
          ...
    
          public E get(int index) {
              synchronized (mutex) {
                  return list.get(index);}
              }
          }
    
          ...
      }
    

    很典型的装饰器模式的应用,功能委托给真正的内部list,外部套上synchronized,使用的锁是内部final的Object对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值