多线程安全:多线程访问了共享的资源,就会产生线程安全问题。
原理:因为多线程会同时对一个资源操作,就会造成数据混乱。比如对同一个数据进行加1操作,三个线程同时对它操作,可能就会出现三次加1是对同一个值也就只是加1的效果,而不是加3的效果。
解决线程安全问题:Java引进了线程同步机制。
有三种方式完成同步操作:1.同步代码块;2.同步方法;3.Lock锁机制。
1、同步代码块:synchronized关键字可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。
如图,“同步锁”即锁对象作用:就是把同步代码块锁住,只让一个线程在同步代码块运行。
代码效果:1、创建一个对象锁;2、对同步代码加上synchronized关键字修饰并传入对象锁。
同步锁原理分析:
2、同步方法:使用synchronized修饰的方法就叫同步方法,保证一个线程执行该方法的时候,其他线程只能在方法外等着。
使用步骤:1、把访问了共享资源的代码抽取出来,放到一个方法中;2、在方法上添加synchronized关键字修饰符
3、Lock锁机制:锁机制提供了比synchronized代码块和synchronized方法更广泛的锁定操作,同步代码块/同步方法具有的功能Lock都有,且更强大和更体现面向对象。
使用步骤:
1、在类的成员位置创建一个Lock的实现类(如ReentrantLock)对象;
2、在可能出现线程安全问题的代码前调用Lock接口中的luck方法获取锁;
3、在可能出现线程安全问题的代码后调用Lock接口中的unluck方法释放锁。