1、volatile 关键字
java 支持多个线程同时访问一个对象或对象的成员变量,而每个线程拥有这个变量的拷贝,虽然对象或成员变量分配的内存在共享内存,但每个执行的线程可以拥有一份拷贝,可以提高程序的执行效率,所以多线程看到的变量不一定是最新的。
volatile关键字可以保证程序对变量的每次读取都从共享内存读取,而对它的改变也必须同时刷新到共享内存。从而保证所有线程对变量访问的可见性。
但是过多的使用volatile关键字,会影响程序的执行效率。所以要谨慎使用
2、synchronized 关键字
synchronized可以修饰方法或者代码块,可以确保多个线程同一时刻只有线程处于方法或者同步快中。
synchronized本质是对对象的监视器(monitor)进行获取,而这个获取过程是排他性的。
3、 对象上的wait/notify
在当前线程执行对象的wait和notify方法,当前线程必须获取对象的监视器,如果没有获取对象的监视器,会报java.lang.IllegalMonitorStateException。一般的代码框架为
synchronized (object){
try {
object.wait();
}catch (InterruptedException e){
e.printStackTrace();
}
}
synchronized (object){
object.notify();
}
执行object.wait()方法时,线程释放object的锁,然后将自己置于object监视器的等待队列;执行object.notify()方法,通知对象等待队列中的一个线程,使该线程由等待队列变为对象的监视器的同步队列,然后该线程尝试去获取object的监视器,获取后线程才能继续执行。
注意notify方法并没有释放对象的监视器,只是通知对象等待队列中一个对象由等待状态变为同步状态,等 synchronized 代码块执行完后,监视器才会释放
4、ThreadLocal
5、join
6、yield
7、sleep
8、intertupt()