线程安全,必须使用各种锁机制来实现,防止某个对象或者值在多个线程中被修改导致的不一致问题。为了保证数据的一致性,我们就需要通过同步机制保证在同一时刻只有一个线程能够访问到该对象或是数据,对它进行修改完毕之后,再将最新的数据同步到主存中,使得其它线程都能得到这个最新数据。
对于JAVA来说,最常用的同步机制就是synchronized关键字,它是一种基于语言的粗滤锁,能够作用于对象、函数、class。每个对象都只有一个锁,谁能拿到这个锁谁就得到了访问权限,当synchronized作用于函数时,实际上锁的也是对象,锁定的对象就是该函数所在的类的对象。而synchronized作用于class时,则是锁的这个class类,并非某个具体的对象,举例如下:
public class SynchronizedDemo{
//锁定的是对象
public synchronized void syncMethod(){
}
public void syncThis(){
synchronized(this){
//代码
}
}
//锁定的是类
public void syncClassMethod(){
synchronized(SynchronizedDemo.class){
}
}
public synchronized static void syncStaticMethod(){
//代码
}
}
前两种锁定的是对象,后两种锁定的是class。对于锁定class,它的作用是防止多个线程同时访问添加了synchronized锁的代码块。而synchronized锁定对象,作用是防止其他线程访问同一个对象中的synchronized代码块或者是函数。当一段代码访问了正在被其他线程执行的synchronized代码块时,会阻塞等待其他线程执行完毕后,再进入synchronized代码块执行。