Java并发编程实践笔记之—线程

线程的优势

  • 多处理器以成为趋势,而单线程只利用了一个处理器,所以线程可以发挥多处理器的强大能力;同时在单处理器上可以提高吞吐率,比如一个线程等待I/O完成,另一个线程可继续运行
  • 用线程可以简化建模,可以为每种类型的任务分配一个专门的线程,复杂异步的工作流分解成一组简单且同步的工作流,每个工作流在一个线程中运行
  • 线程简化了异步事件的处理,比如服务器应用程序(application server)为每个socket连接都分配各自的线程并且使用同步I/O(远低于单线程服务器应用程序使用非阻塞I/O的复杂性)。selectpoll等系统调用实现了在操作系统线程数量的阈值内实现多路I/O
  • 现代GUI框架用一个事件分发线程(Event Dispatch Thread)来代替传统GUI程序中的主事件循环,事件分发线程能及时地处理界面事件,长时间运行的任务在单独的线程中运行,从而使用户界面响应更灵敏

线程的风险

  • 安全性(Safty)问题,常见的是竞态条件(Race Condition),多线程同时访问和修改相同变量时,线程的操作执行顺序是不可预测的,会导致不可预料的后果。Java提供了各种同步机制来协同这种访问
  • 活跃性(liveness)问题,某个操作无法执行下去就会发生活跃性问题,如死循环,死锁
  • 性能(performance)问题,线程调度器临时挂起活跃线程转而运行另一个线程,就会频繁地出现上下文切换操作(Context Switch),带来极大的开销,CPU时间更多地花在了线程调度而不是线程运行商;还有同步机制往往会带来额外的性能开销

线程无处不在

  • JVM启动时,它将为JVM的内部任务创建后台线程,并创建一个主线程来运行main方法
  • 框架中会创建线程,所以应用程序即使没有显式地创建线程,也引入了并发性;并且框架会回调应用程序的代码,不可避免地访问应用程序的状态,所以线程安全性的需求延伸到了这些代码访问的所有代码。
  • 举例,下面这些模块都将在应用程序之外的线程中调用应用程序的代码
  1. Timer:确保TimerTask访问的对象本身是线程安全的
  2. Servlet(Server Applet)JSP(JavaServer Page):需要满足被多个线程同时调用,所以其本身需要是线程安全的。同时Servlet访问的对象可能是共享的,所以也必须是线程安全的
  3. 远程方法调用(Remote Method Invocation,RMI) RMI对象应该做好被多个线程调用的准备,确保自身是线程安全的
  4. SwingAWT
  • Swing程序把所有对GUI组件的方法都放在一个事件线程(event thread)中以保证线程安全,如果某应用程序想在event thread之外控制GUI组件,那控制的代码必须在event thread中运行(控制代码就是event handler)
  • 下面具体情形说明:当用户触发UI动作时,事件线程(event thread)中就会有一个事件处理器(event handler) 被调用执行用户请求。如果handler需要访问和其他线程共享的应用程序状态,那这个handler以及其他需要访问该状态的代码,都必须以线程安全的方式访问
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值