线程安全

进程:

每个程序有一个独立的进程,而进程之间是相互独立存在的。

线程:

进程想要执行任务就需要依赖线程。换句话说,就是进程中的最小执行单位就是线程,并且一个进程中至少有一个线程。

串行:相对于单条线程来执行多个任务,按照一定的顺序去进行,在时间上是不可能发生重叠

并行:在同一时刻发生的,并行在时间上是重叠的。

线程安全(要确保在多条线程访问的时候,我们的程序还能按照我们预期的行为去执行)

1、synchronized(保证我们的线程在多线程环境下,不被多个线程同时执行,确保我们数据的完整性,使用方法一般是加在方法上。于非静态的synchronized方法,锁的是对象本身也就是this)

2、Lock(在需要的时候去手动的获取锁和释放锁,甚至我们还可以中断获取以及超时获取的同步特性)

 

1.线程的安全性问题体现在:

原子性:一个或者多个操作在 CPU 执行的过程中不被中断的特性 可见性:一个线程对共享变量的修改,另外一个线程能够立刻看到 有序性:程序执行的顺序按照代码的先后顺序执行

 

synchronized和Lock的区别:

实现层面不一样。synchronized 是 Java 关键字,JVM 层面 实现加锁和释放锁;Lock 是一个接口,在代码层面实现加锁和释放锁,(CAS乐观锁比synchronized更底层,是CPU原语,属于操作系统层面的) 是否自动释放锁。synchronized 在线程代码执行完或出现异常时自动释放锁;Lock 不会自动释放锁,需要再 finally {} 代码块显式地中释放锁 是否一直等待。synchronized 会导致线程拿不到锁一直等待;Lock 可以设置尝试获取锁或者获取锁失败一定时间超时 获取锁成功是否可知。synchronized 无法得知是否获取锁成功;Lock 可以通过 tryLock 获得加锁是否成功 功能复杂性。synchronized 加锁可重入、不可中断、非公平;Lock 可重入、可判断、可公平和不公平、细分读写锁提高效率

 

posted @ 2021-03-15 10:35  KLAPT  阅读(42)  评论(0编辑  收藏  举报