前言
并发情况下如何保证数据安全,一直都是开发人员每天都要面对的问题,稍不注意就会出现数据异常,造成不可挽回的结果。笔者根据自己的实际开发经验,总结了下面几种保证数据安全的技术手段:
- 无状态
- 不可变
- 安全的发布
- volatile
- synchronized
- lock
- cas
- threadlocal
正文
一.无状态
我们都知道只有多个线程访问公共资源的时候,才可能出现数据安全问题,那么如果我们没有公共资源,是不是就没有这个问题呢?
public class NoStatusService { public void add(String status) { System.out.println("add status:" + status); } public void update(String status) { System.out.println("update status:" + status); } }
二.不可变
如果多个线程访问公共资源是不可变的,也不会出现数据的安全性问题。
public class NoChangeService { public static final String DEFAULT_NAME = "abc"; public void add(String status) { System.out.println("add status:" + status); } }
三.安全的发布
如果类中有公共资源,但是没有对外开放访问权限,即对外安全发布,也没有线程安全问题
public class SafePublishService { private String name; public String getName() { return name; } public void add(String status) { System.out.println("add status:" + status); } }
四.volatile
如果有些公共资源只是一个开关,只要求可见性,不要求原子性,这样可以用volidate关键字定义来解决问题。
public class FlagService { public volatile boolean flag = false; public void change() { if (flag) { System.out.println("return"); return; } flag = true; System.out.println("change"); } }