你的位置:首页 > 软件开发 > Java > 并发编程初探

并发编程初探

发布时间:2016-04-11 23:00:04
在Java并发编程中,对于线程安全是非常重要的,也是必须要考虑的一个问题.可以这么说,只要涉及到网络的,都必须考虑线程安全问题.好了,开始噼里啪啦地开始敲代码之前,我觉得有必要了解一些文绉绉的理论知识,因为这些理论知识是我们敲出来的代码是否是线程安全的一个依据.    当多个线程 ...

  在Java并发编程中,对于线程安全是非常重要的,也是必须要考虑的一个问题.可以这么说,只要涉及到网络的,都必须考虑线程安全问题.好了,开始噼里啪啦地开始敲代码之前,我觉得有必要了解一些文绉绉的理论知识,因为这些理论知识是我们敲出来的代码是否是线程安全的一个依据.  

  当多个线程访问某个状态变量并且其中有一个线程执行写入操作的时候,必须考虑采用同步机制来协同这些线程对变量的访问,Java中的主要同步机制是关键字synchronized,它提供了一种独占的加锁方式,但"同步"这个术语还包括类型的变量,显式锁(Explicit)以及原子变量.

  如果当多个线程访问同一个可变状态变量时,没有使用合适的同步,那么就会出现错误.有三种方式可以修复这个问题:

  1)不在线程间共享该状态变量

  2)将状态变量修改为不可变的变量

  3)在访问状态变量时使用同步

  当设计线程安全的类时,良好的面向对象技术,不可修改性,以及明晰的不变性规范都能起到一定的帮助作用.

  当多个线程访问某个类时,不管运行时环境采用何种调用方式,或者这些线程将如何交替执行,并且在主调代码中不需要任务额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的.

  这里的正确性是指某个类的行为与其规范安全一致,也就是说这个类是实现什么功能的就正确的实现了什么功能.

  在线程安全的类中,封装了必要的同步机制,所以客户端无需进一步采取同步措施.

  前面提到了无状态对象,无状态对象既不包含任何域,也不包含任何其他类中域的引用,无状态对象一定是线程安全的.大多数Servlet都是无状态的,从而极大的降低了在实现Servlet线程安全性的复杂性,只有当Servlet在处理请求时需要保存一些信息,线程才会成为一个安全的线程.

  原子性

  当某个计算正确性取决于多个线程的交替执行时序时,那么就会发生竞态条件.所谓的竞态条件就是多个线程执行的顺序不同,那么执行的结果就会有差异,必须是一个正确的执行嗯顺序才会得出正确的结果.

  有时候为了保证原子性,会采用一种措施,就是延迟初始化,将对象初始化操作推迟到实际使用时才进行,同时要确保只被初始化一次.

  java.util.concurren.atomic包中包含了一些原子变量类,用于实现在数值和对象引用撒谎嗯的原子状态转换.

  在实际情况中,应尽可能地使用现有的线程安全对象(例如AcomicLong )来管理类的状态,与非线程安全的对象相比.判断线程安全对象德 可能状态,及其状态转换情况要更为容易,从而也更容易维护和验证线程安全性.

 

  加锁机制

  要保持状态的一致性,就需要在单个原子操作中更新所相关的状态变量.那么如果是多个原子操作组成一个原子操作呢?那就用到加锁机制了.

  1.内置锁

  同步代码块:包括两个部分,一个作为锁的对象引用,一个最为由这个锁保护的对象的代码块.  

synchronized (lock){   //访问或修改由锁保护的共享状态}  

 

海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com

原标题:并发编程初探

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录