1)多线程环境下,方法内的变量是线程安全的安全
2)多个线程同时处理一个实例,这个实例内的变量是不安全的多线程
3)不一样线程中注入同一个类的不一样实例,实例中的变量是安全的异步
4)Synchronized获取到的锁是对象锁,当多个线程访问同一个对象时,哪一个线程先执行带Synchronized关键字的方法,哪一个线程就持有该方法所属对象的锁,其余线程是等待状态性能
5)调用关键字Synchronized声明的方法必定是排队运行的,另外,只有共享资源的访问才须要同步化this
6)一个对象内有多个Synchronized方法/块时线程
A)A线程先持有object对象的锁,B线程能够以异步的方式调用object对象的非Synchronized方法server
B)A线程先持有object对象的锁,B线程若是此时调用object对象中的任一Synchronized方法,则须要等待A线程释放锁,也就是同步对象
7)实例中有两个变量,有一个Synchronized声明的方法,方法执行过程当中,若一个变量赋值完成,一个变量未赋值完成,此时调用实例中非Synchronized方法去获取实例中两个变量的值,此时就会出现脏读,解决的办法是读取的方法上也加入Synchronized声明继承
8)Synchronized是对象锁,A线程获取到对象锁时,可执行被Synchronized声明的X方法,其余线程想要执行这个对象的任何被Synchronized声明的方法都得等待A释放,由于其余线程未获取到锁资源
9)Synchronized锁重入,在使用Synchronized时,当一个线程获得对象锁时,在此请求此对象的对象锁能够再次获得该对象的锁,一个Synchronized方法/块内部,能够调用本类的其余Synchronized方法/块(也就是说只要不释放,可以一直获取本实例的锁)
10)Synchronized不能继承,举个栗子,父类方法被Synchronized修饰,子类覆写父类的该方法,但并不带Synchronized修饰,就不会产生同步的效果
11)Synchronized代码块,确定比Synchronized方法性能要好一些,也就是说Synchronized后面大括号,包裹的代码越少越好。当一个线程在执行Synchronized代码块时,其余线程能够执行这个代码块外部的代码
12)Synchronized代码块与Synchronized方法特性基本相同
13)任意对象均可以做为对象监视器,能够Synchronized(任意对象),优势:若是一个类中有不少个Synchronized方法,这时虽然可以实现同步,但会受到阻塞,因此影响运行效率;但若是使用同步代码块锁非this对象,则Synchronized(非this)代码块的程序与同步方法是异步的,不与其余锁this同步方法争抢this锁,可大大提升运行效率
A)当多个线程同时执行Synchronized(X,非this)同步代码块时呈同步效果
B)当其余线程执行X对象中Synchronized同步方法时也呈同步效果
C)当其余线程执行X对象方法里面的Synchronized(this)时也呈同步效果
14)Synchronized能够用在static关键字之上,表示对当前类持锁,class锁。class锁能够对类的全部对象实例起做用。也就是说,对于class A来讲,即使多个线程中每一个线程建立一个A的实例,只要他们调用的是A中static synchronized的方法(或者static方法中的synchronized代码块),就得等着,就是同步
15)一般状况下,都不会将String做为锁对象,由于String存在一个常量池,当两个线程调用的String相等时,至关因而竞争同一个锁;另外,当锁住某个String变量时x,若同步方法内对x进行了更改,至关于锁对象就变化了,其余再来竞争锁就能竞争到,就起不到同步的效果了(须要注意的是,只要对象不变,即使对象的属性发生变动,也是同步的,String是由于其池化致使的一系列不一样)
16)当一个synchronized方法中出现死循环时(永远都不会释放锁),其余调用改对象中synchronized方法的线程均会一直等下去,解决方法是尽可能每一个方法锁不一样的对象,而不是都锁this
17)死锁,一个方法,先锁A,等一会再锁B;另外一个方法,先锁B,等一会再锁A;当两个方法同时执行时,就出现死锁了。
18)volatile的主要做用是使变量在多个线程间可见。原理是强制线程从公共堆栈中得到变量的值,而不是从线程的私有堆栈中取值。(举个栗子:当JVM设置为-server模式时,为了线程运行的效率,线程一直在私有堆栈中取值,这样,在一个while(x)的循环中,就算外部将x设置为false,线程内也不会跟着改变,从而进入到死循环状态,这是就须要用到volatile关键字了。volatile主要使用的场合是在多个线程中,能够感知实例变量被改变了,而且得到最新的值使用)
19) volatile本质上解决的是私有堆栈与公共堆栈中的值不一样步
20)volatile与synchronized的异同
A)volatile是线程同步的轻量级实现,性能要比synchronized好;volatile只能修饰变量,而synchronized能够修饰方法或者代码块,synchronized还有性能提高的空间
B)使用volatile不会产生阻塞,而使用synchronized会产生阻塞
C)volatile保证可见性,但不保证原子性;synchronized保证原子性,间接保证可见性(一个变量只能在同步中操做完成了,才能被其余线程操做,因此叫间接)
D)volatile解决的是变量在多个线程之间的可见性,而synchronized解决的是多个线程访问资源的同步性
21)synchronized能够保证在同一时刻,只有一个线程能够执行某一个方法或者某一代码块,它包含两个特性:互斥性和可见性。不进能够解决一个线程看到对象处于不一致状态,还能够保证进入同步方法或者同步代码块的每一个线程,都看到由同一个锁保护以前的全部的修改效果。