java并发编程---线程基本概念

        最近在复习java并发,需要自己好好总结、整理。好记性不如烂笔头。

        在学习Java并发之前,我们需要了解一些基本概念:共享、可变、线程安全、原子性、可见性和有序性。

 一、共享和可变

        要编写线程安全的代码,其核心在于对共享的和可变的状态进行访问。

        “共享”就意味着变量可以被多个线程同时访问。我们知道系统中的资源是有限的,不同的线程对资源都是具有着同等的使用权。有限、公平引发就意味着竞争,竞争就会可能会引发线程问题。

        “可变”是指变量的值在其生命周期内是可以发生改变的。“可变”对应的就是“不可变”。我们知道不可变的对象一定是线程安全的,并且永远也不需要额外的同步(因为一个不可变的对象只要构建正确,其外部可见状态永久都不会发生变化)。所以“可变”意味着存在线程不安全的风险。解决方法:

  1. 不在线程中共享改状态变量,可以将变量封装到方法中。
  2. 将状态变量修改为不可变的变量(final)。
  3. 访问状态变量时使用同步策略。
  4. 使用原子变量。

二、线程安全性

        线程安全是一个比较复杂的概念。其核心概念就是正确性。所谓正确性,就是某各类的行为与其规范完全一致,即其近似与“所见即所知”。当多个线程访问某各类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或者写协同,这个类都能表现出正确的行为,那么就称这个类时线程安全的。

三、线程同步

        线程同步其核心就在于一个“同”,所谓“同”就是协同、协助、配合,“同步”就是协同步调,也就是按照预定的先后顺序进行运行,即“你先,我等;你做完,我再做”。

        线程同步,就是当线程发出一个功能调用时,在没有结果之前,该调用就不会返回,其他线程也不能调用该方法。就一般而言,我们在说同步、异步的时候,特指那些需要其他组件来配合或者需要一定时间来完成任务。在多线程编程里面,一些较为敏感的数据是不允许被多个线程同时访问的,使用线程同步技术,确保数据在任何时刻最多只有一个线程访问,保证数据的完整性。

        线程同步机制主要有:临界区、互斥量、事件和信号四种方式。

  1. 临界区:通过对多线程的串行化来访问公共资源或者一段代码,速度快,适合控制数据访问。在任何时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他线程试图访问公共资源将被挂起,并一直等到进入临界区的线程离开,临界区被释放后,其他线程才可以抢占。
  2. 互斥量:采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享。
  3. 信号量:它允许多个线程再同一时刻访问统一资源,但是需要限制在同一时刻访问此资源的最大线程数目。
  4. 事件:通过通知操作的方式来保持线程的同步,还可以方便实现对多个线程的优先级比较的操作。

四、原子性

        原子是世界上最小的单位,具有不可分割性。在我们的编程世界里,某个操作如果不可分割我们就称之为该操作具有原子性。例如:i = 0,这个操作是不可分割的,所以该操作具有原子性。如果某个操作可以分割,那么该操作就不具备原子性,例如:i++。非原子操作都存在线程安全问题,这个时候我们需要使用同步机制来保证这些操作变成原子操作,来确保线程安全。

五、可见性

        线程可见性是指线程之间的可见性,即一个线程对状态的修改对另一个线程是可见的,也就是一个线程修改的结果,另外一个线程立马就知道了。比如volitile修饰的变量,就具备可见性。

六、有序性

        有序性指的是数据不相关的变量在并发的情况下,实际执行的结果和单线程的执行结果是一样的,不会因为重排序的问题导致结果不可预知。volatile, final, synchronized,显式锁都可以保证有序性。

转载于:https://my.oschina.net/u/998410/blog/1525223

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值