如何保证线程安全

1.无状态

没有公共资源,线程一定安全

2.不可变

公共资源不可变,线程一定安全

 

 

 3.无修改权限

不提供修改入口,属性私有

 

 

 4.synchronized同步机制

同步方法和同步代码块,优先使用同步代码块,因为粒度小

5.Lock接口实现类ReentrantLock

显示锁ReentrantLock包含了公平锁、非公平锁、可重入锁、读写锁,使用时要在finally里手动释放

6.分布式锁

对于synchronized和lock对于单个节点可以保证线程安全,但是不同节点的分布式环境无法保证,这时可以使用分布式锁

比如:数据库分布式锁、zookeeper分布式锁、redis分布式锁 

 

 7.volatile

如果只要求多个线程之间的可见性,比如只是控制某个功能的开关,那么使用volatile就可以

public class VolatileTest {
    volatile boolean flag = true;

    public void updateFlag() {
        this.flag = false;
        System.out.println("修改flag值为:" + this.flag);
    }

    public static void main(String[] args) {
        VolatileTest test = new VolatileTest();
        new Thread(() -> {
            while (test.flag) {
            }
            System.out.println(Thread.currentThread().getName() + "结束");
        }, "Thread1").start();

        new Thread(() -> {
            try {
                Thread.sleep(2000);
                test.updateFlag();
            } catch (InterruptedException e) {
            }
        }, "Thread2").start();

    }
}

8.ThreadLocal

9.线程安全集合

CopyOnWriteArrayList、ConCurrentHashMap、CopyOnWriteArraySet、ArrayBlockingQueue等等

10.CAS机制JDK

11.做数据隔离

比如对于同一用户处理使用单个线程,不存在多个线程对同一用户进行处理
posted @ 2022-10-18 20:30  求道之愚者  阅读(458)  评论(0)    收藏  举报