如何锁定以对象,让别的线程访问不了这个对象的任何内容 java锁 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 看上去你所说的锁定不像是线程同步的锁定,线程同步在锁被释放之后可以由另一个线程请求锁,而且如果其它线程如果没有打算请求锁定即使有线程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(); 读写锁 ;同步代码块,wait+notify 那就是直接用线程锁定了。不需要 ThreadLocal ,但要约定所有需要这样的地方都需要先申请锁,不申请锁的代码并不需要理会当前锁被谁拿在手上它都能访问那个对象,只是没有锁定的时候有些东西无法精确地预料是否是期望的。 那就是直接用线程锁定了。不需要 ThreadLocal ,但要约定所有需要这样的地方都需要先申请锁,不申请锁的代码并不需要理会当前锁被谁拿在手上它都能访问那个对象,只是没有锁定的时候有些东西无法精确地预料是否是期望的。那如何用线程直接锁定呢? 使用Semaphore类控制对象的访问。 iframe中表单提交返回的页面问题 SSH 连接DB2的问题 高分求用java做一个读取文件属性程序! resultSet问题 小问题,如何在onclick的时候触发多个事件呢(用什么来区分)? JAVA怎么实现链表的插入、删除、查找操作?多谢了 For input string是什么错啊?! 操作cookie的困惑 ASP中 Javascript的不算大的小问题? 如何开始我的servlet程序,编译报错: package javax.servlet does not exist struts2中iterator的用法 一般上传的文件,都保存在哪个目录下
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();
那就是直接用线程锁定了。不需要 ThreadLocal ,但要约定所有需要这样的地方都需要先申请锁,不申请锁的代码并不需要理会当前锁被谁拿在手上它都能访问那个对象,只是没有锁定的时候有些东西无法精确地预料是否是期望的。
那就是直接用线程锁定了。不需要 ThreadLocal ,但要约定所有需要这样的地方都需要先申请锁,不申请锁的代码并不需要理会当前锁被谁拿在手上它都能访问那个对象,只是没有锁定的时候有些东西无法精确地预料是否是期望的。那如何用线程直接锁定呢?