线程安全其实本质 讲的是内存的安全。
多个线程对统一资源的操作可能导致这个资源的数据不一致性。
举例说明:比如 张三有100块钱,现在线程A是要花50元,线程二是要存300元,当线程A花50元后,还没有内存值修改,线程二获取到100元+300,将400的值给到张三,此时线程二处理完成,张三有400元,而此时线程A100-50=50,将张三的钱改为了50,最终张三有50块钱,此时数据一致性没有得到保证,出了问题。
解决办法:
一、将数据放入栈中
比如局部变量是由操作系统决定的,只属于某一个方法
二、线程拷贝
只处理自己的变量,将变量复制一份,只处理自己的,不处理别人的
三、只读
规定只能读,不能改
四、悲观锁
处理之前先加锁,处理完成后再解锁
五、乐观锁
先获取数据,处理完,在获取一下数据看是否和之前的修改版本号是否一致一致,如果一直再提交
在golang中,可以使用channel来处理