找工作ing,fighting~
文章目录:
- 多线程并发问题
- Java的同步机制
多线程并发问题
多线程并发 :多个线程同时工作
多线程并发会产生很多问题,如丢失修改、不可重复读、脏读、死锁等。
为了协调进程之间的制约关系,引入进程同步互斥概念。
同步 :直接制约关系,协调多个线程的工作次序而等待、传递信息所产生的制约关系,控制。例如访问冲突等。
互斥 :间接制约关系,当一个线程进入临界区使用临界资源时,另一个进程必须等待。空闲让进、忙则等待、有限等待、让权等待。
异步 :A线程要请求某个资源,但是此资源正在被B线程使用中,因为没有同步机制存在,A线程仍可以请求,A线程无需等待。
同步最最安全,最保险的。而异步不安全,容易导致死锁,这样一个线程死掉就会导致整个进程崩溃,但没有同步机制的存在,性能会有所提升
线程池 :存放线程
多线程的三个特性 :
原子性:是一个或者多个操作在 CPU 执行的过程中不被中断的特性。
可见性:当一个线程修改了共享变量后,其他线程能够立即得知这个修改,volatile可以保证可见性。
有序性:是程序按照代码的先后顺序执行,为了性能优化,编译器和处理器会可能进行指令重排序,有时候会改变程序中语句的先后顺序。编译器调整了语句的顺序,在单线程中并没有什么影响,但是在多线程中可能会出现异常。
Java的同步机制
- ThreadLocal
- synchronized
- wait()等待notify()唤醒
- volatile():volatile 修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。当成员变量发生变化时,强迫线程将变化值回写到共享内存。不具有原子性。
sleep() vs. wait()
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,把执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。