synchronized关键字与volatile关键字的使用-java

----在多线程中,需要考虑安全和性能(效率)两大问题,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();
        }
    }
}
发布了18 篇原创文章 · 获赞 5 · 访问量 852

猜你喜欢

转载自blog.csdn.net/weixin_44762188/article/details/103107948