并发编程 — 实现线程安全

[size=medium]
并发编程系列文章:
初解线程池:[url]http://ray-yui.iteye.com/blog/2072463[/url]
详解线程池:[url]http://ray-yui.iteye.com/blog/2075311[/url]
并发数据类型:[url]http://ray-yui.iteye.com/blog/2080454[/url]
并发数据结构:[url]http://ray-yui.iteye.com/blog/2084202[/url]
volatile:[url]http://ray-yui.iteye.com/blog/2231474[/url]
判断线程安全:[url]http://ray-yui.iteye.com/blog/2232931[/url]
实现线程安全:[url]http://ray-yui.iteye.com/blog/2234688[/url]
[/size]
[size=medium]
在多线程程序开发当中,可以使用一些编程技巧规避线程安全问题或减少使用锁导致的额外开销.
[/size]
[size=medium]
[b][color=darkblue]1.线程封闭[/color][/b]
当多个线程访问修改同一对象时需要使用同步机制,其中一种规避方法是不共享任何数据.[b][color=red]参数传入线程时传入变量的复制.或所有变量/对象都从线程当中创建[/color][/b].这种方法将所有线程所能触及的变量都封闭在线程内部本身,即使被封闭的对象不是线程安全,也可以达到线程安全的效果.
[/size]
[size=medium]
[b][color=darkblue]2.实例封闭[/color][/b]
[b][color=red]当一个对象被封闭在另一个新创建的对象当中时,能访问该对象的所有代码路径都是已知的[/color][/b].例如struct2中的Action就是使用实例封闭的方式实现线程安全.框架保证每一个请求都创建一个全新的Action对象,从而将线程安全委托给实例封闭
[/size]
[size=medium]
[b][color=darkblue]3.栈封闭[/color][/b]
栈封闭的使用方式在三层架构当中非常常用.通常使用在封闭的方法当中,[b][color=red]方法只操作传入参数进行业务处理[/color][/b].例如service只操作通过上层传入的参数调用DAO层,SpringMVC由于Controller是单例对象,所有的操作都在方法级别进行栈封闭从而实现线程安全.
[/size]
[size=medium]
[b][color=darkblue]4.ThreadLocal[/color][/b]
ThreadLocal在多线程的Web系统中应用非常广泛,如Struct2的ActionContext.JSF的FacesContext.Spring的Transactional都是通过ThreadLocal实现.[b][color=red]ThreadLocal允许被置入的对象访问域提升到线程的级别.但使用ThreadLocal时需要注意,这是一种变量侵入式的设计.ThreadLocal的设置位置可能和读取位置相隔甚远,甚至无法从代码调用的上下文中寻找到设置该变量的位置[/color][/b].这导致业务逻辑依赖ThreadLocal.
[/size]
[size=medium]
[b][color=darkblue]5.不变对象[/color][/b]
不变对象天生对多线程环境友好.[b][color=red]当一个对象创建后就没有任何代码路径会修改对象中的属性.由于没有提供任何方法对其属性修改[/color][/b],因此可以自由地在多线程中共享访问.[b][color=red]但需要注意并非不提供setter方法就视为不变对象,而是所有暴露出去的方法中没有任何一个会对属性进行修改[/color][/b].对象的所有属性在创建对象时已经确定.并且不会有改变
[/size]
[size=medium]
[b][color=darkblue]6.委托并发容器发布对象[/color][/b]
Java当中提供了很多线程安全的容器.当一个对象通过线程安全容器进行发布时,我们可以认为这个对象已被安全的发布出去并处于线程安全状态.
[/size]
[size=medium]
[b][color=darkblue]总结:[/color][/b]
以上实现线程安全的方式都不曾提及公有的静态变量.而公有的静态变量往往是容易被忽略导致线程安全问题发生的原因.包括一些全局的作用域例如HttpServletRequest操作Application作用域时,由于Application是全局共享的,所以当操作Application时仍然需要同步操作.
[/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CountDownLatch是Java并发编程中的一种同步工具类。它的作用是允许一个或多个线程等待其他线程完成操作。CountDownLatch的构造函数接收一个计数值,当计数值变为0时,等待的线程就会被唤醒。使用CountDownLatch可以实现线并发编程中的线程协作。 与使用join方法等待多个线程执行完毕不同,CountDownLatch相对灵活。可以通过调用countDown方法来减少计数,唤醒被阻塞的线程。这使得多个线程可以同时进行,并在一定条件下等待其他线程完成后再继续执行。 CountDownLatch一般称为闭锁或计数器,它是Java并发编程中的一种多线程同步工具。它属于AQS(AbstractQueuedSynchronizer)体系的一员,可以实现线程之间的协作和同步操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Java多线程之并发工具类](https://download.csdn.net/download/weixin_38713057/13756829)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [java多线并发之CountDownLatch](https://blog.csdn.net/weixin_42419762/article/details/116220340)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [多线编程之 CountDownLatch](https://blog.csdn.net/jiangxiayouyu/article/details/118107977)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值