WHAT

线程是程序执行中的最小单元,依赖进程存在。线程的同步可以理解为该线程在未返回结果之前你处于阻塞状态。

WHY

在JAVA多线程并发中,当多个线程同时操作一个共享资源时,可能会发生资源数据的不准确,或者是数据的冲突,为了避免此类情况的发生,需要在一个线程操作该资源时,将该资源锁定,使得其他线程不可对此资源进行操作,以保证资源数据的准确性。

HOW
1.同步方法

使用synchronized关键字修饰的方法,如:
public synchronized void save(){}

2.同步代码块

使用synchronized关键字修饰的语句块,如:
synchronized(object){}

3.使用特殊域变量(volatile)

 //需要同步的变量加上volatile
 private volatile int account = 100;

4.使用重入锁

 class Bank {

        private int account = 100;
        //需要声明这个锁
        private Lock lock = new ReentrantLock();
        public int getAccount() {
            return account;
        }
        //这里不再需要synchronized 
        public void save(int money) {
            lock.lock();
            try{
                account += money;
            }finally{
                lock.unlock();
            }

        }
    }

5.使用ThreadLocal

    public class Bank{
        //使用ThreadLocal类管理共享变量account
        private static ThreadLocal<Integer> account = new ThreadLocal<Integer>(){
            @Override
            protected Integer initialValue(){
                return 100;
            }
        };
        public void save(int money){
            account.set(account.get()+money);
        }
        public int getAccount(){
            return account.get();
        }
    }


notify_guo
1 声望1 粉丝