解决方案 »

  1.   

    看上去你所说的锁定不像是线程同步的锁定,线程同步在锁被释放之后可以由另一个线程请求锁,而且如果其它线程如果没有打算请求锁定即使有线程A锁定了某个对象,其它不要求同步的线程依然可以使用这个对象。所以锁定只是一个设计(或者说约定)并不是一种能力。如果你只是希望一个对象在这个终生只为一个线程使用,如果这个线程终止或线程池中的一个 worker 线程完成了一个请求之后这个对象就消失的话,那么我们可以考虑使用 ThreadLocal
      public class Context {
          private static final ThreadLocal contexts = new TheadLocal();
          public static final Context getCurrentInstance() {
                  return (Context) contexts.get();
          }      public static void init(Context me) {
                  contexts.set(me);
          }      public static void clear() {
                   contexts.set(null);
          }      Context() { // 设置为非 public,防止其它包直接访问它们。
          }
      }   在你的请求的开始处初始化 Context,在结束处清理,比如 Web 程序的 filter 的开始初始化结束清理,在整个请求过程中(web 请求它就是使用一个线程池)保持一个请求使用自己专用的 context 实例。这种设计的好处也简单明了,在当前线程的任何地方直接 Context.getCurrentInstance() 都能得到这个对象,而不需要考虑传递参数到调用的深处,想象一下在 BO, DAO 各层保存一个唯一的 context 参数是件多麻烦的事情,缓存了之后容易错乱。 // 初始化,框架层。
       Context ctx = new Context();
        Context.init(ctx);// 使用它,业务层
       ctx = Context.getCurrentInstance(); // 框架层清理
      Context.clear();
      

  2.   

    读写锁 ;同步代码块,wait+notify
      

  3.   


    那就是直接用线程锁定了。不需要 ThreadLocal ,但要约定所有需要这样的地方都需要先申请锁,不申请锁的代码并不需要理会当前锁被谁拿在手上它都能访问那个对象,只是没有锁定的时候有些东西无法精确地预料是否是期望的。
      

  4.   


    那就是直接用线程锁定了。不需要 ThreadLocal ,但要约定所有需要这样的地方都需要先申请锁,不申请锁的代码并不需要理会当前锁被谁拿在手上它都能访问那个对象,只是没有锁定的时候有些东西无法精确地预料是否是期望的。那如何用线程直接锁定呢?
      

  5.   

    使用Semaphore类控制对象的访问。