1.synchronized关键字用于方法及代码块,而volatile关键词用于修饰变量。
2.在多线程环境下运行时,volatile修饰的变量将不会在线程堆区进行缓存,而是直接写入到‘主存’,所有对volatile修饰变量的修改,都将直接修改“主存”中的值。所以volatile关键字能保证数据的一致性,但却不能解决并发所带来的竞态竞争等问题。
3.synchronized关键字将获取对象的锁,当且仅当多个线程同时尝试获取同一个锁时,线程才有可能被阻塞(比如该锁正被别的线程持有)。所以锁对象(synchronized(obj){}中的obj)是可以与当前对象解耦的,所有希望同步代码块只要同时被同一个锁保护,那这些代码块之间就是互斥的(但若在拥有该锁的情况下,再次请求被该锁“锁住”的代码时,不需要重新申请锁及可执行--可重入),而与obj具体是什么对象无关。被synchronized的修饰的方法的锁对象默认为当前对象(方法调用者,this)。
4.synchronized获得并释放监视器(monitor)——如果两个线程使用了同一个对象锁,监视器能强制保证代码块同时只被一个线程所执行——这是众所周知的事 实。但是,synchronized也同步内存:事实上,synchronized在“主”内存区域同步整个线程的内存。