----在多线程中,需要考虑安全和性能(效率)两大问题,synchronized关键字和volatile关键字解决了其部分问题。
synchronized(同步互斥)关键字:用的锁是存在java对象头里的。它锁定对象的所有同步的地方,都会同步互斥。
(1)synchronized静态同步方法:锁定的是当前类对象
(2)synchronized同步实例方法:锁定当前对象(this)
(3)synchronized(obj)同步代码块,锁定的是obj对象
volatile关键字:是线程同步的轻量级实现。
(1)修饰的共享变量,可以保证可见性,部分保证顺序性(有序性);
(2)对于有序性来说,具体指禁止指令重排序。(CPU和JVM都有重排序)
(3)经常用volatile来保证共享变量的读取操作安全。
synchronized关键字与volatile关键字的区别:
(1)volatile性能肯定比synchronized关键字要好;
(2)volatile关键字只能用于变量而synchronized关键字可以修饰方法以及代码块。
(3)在多线程访问volatile关键字不会发生阻塞,而synchronized关键字可能会发生阻塞;
(4)volatile关键字能保证数据的可见性,但不能保证数据的原子性。synchronized关键字两者都能保证。
(5)volatile关键字用于解决变量在多个线程之间的可见性,而synchronized关键字解决的是多个线程之间访问资源的同步性。
**·**其使用举例如下:
import java.io.File;
public class FileOperator {
private volatile File file;
// 对文件的读和写操作
public void read(){ //可以同时读
// String = file.read 伪代码
}
public synchronized void write(){ // 写-写互斥
// file.write(String) 伪代码
}
public static void main(String[] args) {
FileOperator operator = new FileOperator();
for (int i = 0; i < 10; i++){
new Thread(new Runnable() {
@Override
public void run() {
operator.write();
}
}).start();
}
for (int i = 0; i < 10; i++){
new Thread(new Runnable() {
@Override
public void run() {
operator.read();
}
}).start();
}
}
}