每个线程都有自己的工作内存,并且每个线程在自己的工作内存交互,内存控制不当会造成数据不一致。
同步方法,同步块。
synchronized方法和synchronized块最难的一个点是锁的对象。
synchronized方法默认锁的是这个对象这个类本身,synchronized块可以锁任何对象。
锁的对象就是变化的量,也就是需要增删改的对象。
多个线程各自占有一些共享资源,并且互相等待其他线程占有的资源才能运行,而导致两个或多个线程都在等待对方释放资源,都停止执行的情形。某一个同步块同时拥有“两个以上对象的锁”时,就可能会发生“死锁”的问题。
synchronized与Lock的对比
- Lock(锁)
- class A{
- //可重入锁
- private final ReentrantLock lock = new ReentrantLock();
- public void m(){
- lock.lock();
- try {
- //保证线程安全的代码;
- }
- finally {
- lock.unlock();
- //如果同步代码有异常,要将unlock()写入finally语句块
- }
- }
- }