前言:在多线程环境中,很容易引发线程安全问题,而所谓的线程安全是指多个线程对同一个对象的操作,造成其他线程持有的对象改变,使得实际结果与预期结果不符,实质上就是对公共资源的争夺和修改。为避免线程安全问题,同时又增加cpu利用率,就需要对公共资源的获取与修改进行控制。
方式
方法 | 解释 |
---|---|
synchronized关键字 | 由JVM实现并保证。该关键字可作用于静态方法、对象方法和对象。java中的锁,通过Object(所有对象都可当做一个锁)来充当,加锁实际上表示的是某一个线程获取到了锁(对象),相反解锁就是释放锁(对象)。因此该关键字的不同作用域可表明:作用于静态方法,以类对象作为锁;作用于对象方法,以本实例对象作为锁;作用于对象,以该对象作为锁。 |
lock | ReentrantLock或ReadWriteLock。由jdk代码实现。每一个实例对象,即为一个锁。由lock()和unlock()方法显示锁和解锁。相比于synchronized关键字,这种方式可额外提供公平锁的加锁方式,且这种方式比较灵活,但耗费精力。 |
volatile关键字 | 只作用于变量,保证变量的可见性,即对该变量的修改将对所有线程可见,但只限于set操作,对于i++这种操作,无法保证原子性。 |