1.什么是线程安全
线程安全的概念:当多个线程访问某一个类的(对象或方法)时,这个类始终都能表现出正确行为,那么这个类(对象或方法)就是线程安全的。
2.如果现实线程安全
synchronized :可以在任意对象及方法上加锁,而这段加锁的代码称为“互斥区”或者“临界区”。
一个线程想要执行synchronized修饰的方法里面的代码时,首先是尝试获取锁,如果拿到锁,执行synchronized代码体,拿不到时一直尝试获得这把锁,直到拿到为止,而且是多线程同时去竞争这把锁,(也就是会有锁竞争的问题)。
多个线程多个锁:
如果在static的方法synchronized修饰 标识是类锁 独占锁
3.对象锁的同步和异步
同步:synchronized
同步的概念就是共享,如果不是共享的资源,就没有必要进行同步的。
异步:asynchronized
异步的概念就独立,相互之间不受任何制约,类似于ajax 请求。
同步的目的是为了线程安全,其实对于线程安全来说,需要满足两个特性:
原子性(同步)
可见性
4.脏读
5.synchronized 锁重入(jdk 1.8 之后性能接近于lock)
关键字synchronize拥有锁重入的功能,
6.volatile 关键字
用于修饰变量在多个线程之间可见性,不具备synchronized 关键字的原子性,性能比synchronized 强很多,不会造成阻塞,在很多开源的架构里使用,比如netyy的底层代码大量使用volatile,一般volatile用于只针对多个线程可见的变量操作,并不能代替synchronized 的同步功能,要实现原子性推荐使用atomic类的系列的对象,支持原子性操作(注意atomci类只保证本身方法的原子性,并不保证多次操作的原子性)