JAVA并发编程实战笔记01

1.线程安全性:当多个线程访问某个类时,这个类始终能表现正确的行为,那么就称这个类是线程安全的。

2.原子性:在化学中原子是最小的单位,不可分割(打个比喻,帮助理解,不喜勿喷)java(java.util.concurrent.atomic)包下,大部分都是原子变量类

3.可见性:线程之间的可见性,一个线程修改的状态对另一个线程是可见的,比如volatile关键字,稍后再后来的文章中讲述它的适用场景

4.竟态条件:在多线程中,由于不恰当的执行时序而出现不正确的结果。竟态条件类型:先检查在执行,读取-修改-写入,让我分别举一个例子

 先检查在执行:if(null != source){//执行业务逻辑},当在多线程中,多个线程进入先检查阶段,其中一个线程快速执行把“source”置空,但是其他线程已经进入执行阶段导入不正确的结果。

读取-修改-写入:最典型的是“count++”,多线程中,同时获取到count值,其中一个线程已经先执行修改、写入操作,导致不正确的结果。

5.无状态、有状态:一般修饰对象

     无状态对象(线程安全):没有实例变量的对象,反之是有状态对象(非线程安全)

6.内置锁:每个JAVA对象都可以用来实现同步锁,线程进去同步块之前会自动获取锁,退出同步块会自动释放锁(抛出异常也会自动释放锁),内置锁是可以重入

public class Widget {

public synchronized void doSomething(){
       //执行逻辑
}
}
class LoggingWidget extends Widget {
@Override
public synchronized void doSomething() {
//执行逻辑
super.doSomething();
}

}

如果内置所不可以重入,导致代码死锁

7.死锁:当线程A需要线程B的资源才能继续执行,线程B需要线程A的资源才能继续执行,这种情况称之为死锁

8.锁竞争:对于锁竞争,有必要提一嘴,非常消耗CPU性能,线程的执行是按照CPU分配的先后顺序而定的,当多个线程竞争执行同步块或者同步方法时,当一个线程进行同步块或者同步方法,其他线程不断的尝试去进入同步块或者同步方法,导入CPU性能消耗过大

9.synchronized:关键字synchronized取得的锁都是对象锁,而不是把一段代码(方法)当做锁,所以代码中哪个线程先执行synchronized关键字的方法,哪个线程就持有该方法所属对象的锁(Lock),在静态方法上加synchronized关键字,表示锁定.class类,类一级别的锁(独占.class类)。

10.重排序:为了为了提高性能,编译器和处理器常常会对指令进行重排序。重排序主要分为两类:编译器优化的重排序、指令级别并行的重排序和内存系统的重排序

11.Volatile变量:JAVA语言提供了一种稍弱的同步机制,当把变量声明volatile时,编译器与运行时都会注意这个变量是共享的,不会重排序,只满足可见性,不能确保原子性

使用场景:1对变量的写入操作不依赖变量的当前值,或者单线程更新变量的值,

                 2该变量不会与其他状态变量一起纳入不变性条件中(单独用)

                 3在访问变量时不需要加锁

                 4通过使用包含多个状态变量的容器(对象中都是final类型属性或者称之为状态)来维持不变性条件,并使用一个                        valatile类型的引用确保可见性





猜你喜欢

转载自blog.csdn.net/qq_24811513/article/details/80266515
今日推荐