java并发编程详解(一)初步了解线程

线程

线程与进程最大的区别就是 每个进程都独立分配着独立的资源包括内存等,进程之间通过粗力度的通信交换数据。而线程则是共享进程范围内的资源。那个线程拥有各自的程序计数器,局部变量等。因此线程也被称为轻量级进程。
在大多数操作系统中线程都是基本的调度单位,正因为如此如果程序中只有一个线程,那么最多同时只能在一个处理器上运行,但是现在大部分都是多核处理器,这样单线程同时只能使用部分cpu资源。多线程可以帮助我们充分的利用多核cpu资源。
但是并不是说为了提高性能线程多少完全取决于服务器是几核处理器。因为单线程在单处理器上运行时,当线程在等待I/O等操作完成时,处理器将处于空闲状态。如果多线程的情况下便可以充分利用这段时间的cpu资源。

线程的风险

安全性

最常见的安全性问题就是竞态条件,也就是我们常说的数据同步问题。典型的多线程下的自增操作。自增看上去是单个操作,实际上自增包含读取value,value+1,将计算结果写入value三个操作。读,计算,写这三个操作在多线程之间可能是交替进行的。线程A在写之前线程B进行读操作最终两个线程的运行结果相同,value进行了两次自增,结果却只进行了一次自增。
事实上由于指令重排的可能,情况可能更加复杂。后续的博客会详细讲解。

活跃性问题

安全性是要保证程序不发生错误,那么活跃性就是说要保证任务最终可以执行完成。比如无限循环等。
常见的活跃性问题包括死锁,饥饿,活锁。后续博客会针对这些问题详细讲解。

性能问题

很多人认为多线程就是为了提高性能,但是多线程核单线程一样存在性能问题。而且由于多个线程之间的互相影响这些性能问题更加复杂。
首先在多线程中,当线程调度器临时挂起活跃线程去运行另一个线程时,会频繁的出现上下文切换操作,这种操作会带来极大的开销。频繁保存恢复执行上下文操作,会使cpu将时间更多的花在线程调度上而不是线程运行。
其次当线程间共享数据时,必须使用数据同步机制,而这些机制会抑制某些编译器的优化,使内存缓存区内的数据无效。
以上所有因素都会在多线程情况下带来性能问题。所以在线程数设计不合理时并不一定会提高性能。还是要根据实际情况进行合理设计。后续博客会对这些问题进行详细讲解。

总结

线程在我们的日常项目中是无处不在的,可能我们并没有在项目中创建线程,但是在项目中的各种框架中都可能创建线程。
比如:

  • Timer 定时任务会在Timer管理的线程中运行,而不是由程序控制,这要求我们如果定时任务 调用了其他的对象方法,我们需要保证被调用者的线程安全。
  • Servlet 虽然servlet在日常项目中已经非常的不常用了,但是servlet是典型的多线程且同样不受程序控制。
  • RMI rmi的典型使用代表就是EJB,本人对EJB的了解有限,如果使用RMI要注意线程安全问题。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值