« | October 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | |
| 公告 |
不得窥道门,不得悟佛门,不得入窄门,实乃破门。 |
Blog信息 |
blog名称:破门点滴 日志总数:161 评论数量:404 留言数量:-2 访问次数:1427696 建立时间:2004年11月13日 |

| |
[开发笔记]TrionesRuntime: 关于Framework的思考 心得体会, 软件技术 破门 发表于 2004/12/29 23:49:36 |
1、关于TrionesFramework 对象的思考:
方案一:在ITrionesFramework接口的定义中增加 getAction(),getService(),要求所有MVC框架的实现全部在Framework对象中实现,以便于采用统一的容器管理对象。
方案二:具体容器的选择依然交给ITrionesController 接口的实现处理,在ITrionesFramework中增加 getContext() 方法获取 ITrionesContext对象,允许在Controller之间共享Context。由Controller将容器放入Context对象,实现控制器之间容器的协调。
方案一将增加框架的耦合程度,但是会强化控制器之间的约束,对框架的扩展只能依赖于ITrionesFramework 接口的不同实现。
方案二增加了框架的配置复杂程度,控制器之间的约束差,交叉调度可能会出现容器之间的冲突,但是具有较高的灵活性,通过将来的扩展可能实现跨容器调度。
2、对ITrionesAction接口的思考:
perform(Object)方法对调用进行了强制约束,context对象必须通过参数传递。参考xwork框架发现,IAction接口仅仅约束了 execute() 方法,参数全部通过ActionContext对象传递。ActionContext 采用了ThreadLocal的技术保障线程变量的安全。
参考: ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是thread local variable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。
ThreadLocal和其它同步机制相比有什么优势呢?ThreadLocal和其它所有的同步机制都是为了解决多线程中的对同一变量的访问冲突,在普通的同步机制中,是通过对象加锁来实现多个线程对同一变量的安全访问的。这时该变量是多个线程共享的,使用这种同步机制需要很细致地分析在什么时候对变量进行读写,什么时候需要锁定某个对象,什么时候释放该对象的锁等等很多。所有这些都是因为多个线程共享了资源造成的。ThreadLocal就从另一个角度来解决多线程的并发访问,ThreadLocal会为每一个线程维护一个和该线程绑定的变量的副本,从而隔离了多个线程的数据,每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的整个变量封装进ThreadLocal,或者把该对象的特定于线程的状态封装进ThreadLocal。
由于ThreadLocal中可以持有任何类型的对象,所以使用ThreadLocal get当前线程的值是需要进行强制类型转换。但随着新的Java版本(1.5)将模版的引入,新的支持模版参数的ThreadLocal<T>类将从中受益。也可以减少强制类型转换,并将一些错误检查提前到了编译期,将一定程度地简化ThreadLocal的使用。
当然ThreadLocal并不能替代同步机制,两者面向的问题领域不同。同步机制是为了同步多个线程对相同资源的并发访问,是为了多个线程之间进行通信的有效方式;而ThreadLocal是隔离多个线程的数据共享,从根本上就不在多个线程之间共享资源(变量),这样当然不需要对多个线程进行同步了。所以,如果你需要进行多个线程之间进行通信,则使用同步机制;如果需要隔离多个线程之间的共享冲突,可以使用ThreadLocal,这将极大地简化你的程序,使程序更加易读、简洁。
3、对于Triones服务容器的思考
考虑使用ITrionesContainer 接口来处理服务对象,在Framework中增加getContainer(String id) 方法来从context中获取指定的服务容器。从中获取所需要的服务对象。
先考虑log服务的具体实现。 | |
|