volatile 让内存可见是否能解决这个问题呢? 答案是:不能。因为 volatile 只能保证可见性,不能保证原子性。多个线程同时读取这个共享变量的值,就算保证其他线程修改的可见性,也不能保证线程之间读取到同样的值然后相互覆盖对方的值的情况。 解决方案 说了这么多,对于i++这种线程不安全问题有没有其他解决方案呢?当然有...
接下来说volatile不能解决这个线程安全问题。因为volatile只能保证可见性,不能保证原子性。回答这个只为了让面试官晓得你考虑周全,知识面广。 接下来说可以用锁。使用synchronized或者ReentrantLock都可以解决这个问题。这里还可以比较下这两种方式的优劣。教科书式的比较结束后,来一句“我认为一般使用synchronized更好,因为JV...
1、如果i是局部变量(在方法里定义的),那么是线程安全的。因为局部变量是线程私有的,别的线程访问不到,其实也可以说没有线程安不安全之说,因为别的线程对他造不成影响。 2、如果i是全局变量(类的成员变量),那么是线程不安全的。因为如果是全局变量的话,同一进程中的不同线程都有可能访问到。 如果有大量线程同...
那int类型的i++为什么还有线程安全问题(推测了问题真正想表达的意思)?因为i++在指令中是赋值和自增两个操作。赋值没问题,但自增是要读取和写入两个操作,很明显是非原子性操作,自然就有安全问题。另外volatile只有两个作用,一个是禁用指令重排,一个是强制读取主存,没有绝对的原子性。
在Java并发编程中的一个核心问题就是线程的安全性,当对共享的和可变的状态进行访问时,就会存在线程安全。例如 ++i这一操作,i就是共享数据,i的状态是可变的,当多个线程访问i的时候,由于++i这一操作不是原子性操作,线程A访问i时可能i的值为1,在执行i = i + 1这一操作前,线程B也访问了i,得到的值同样是1...
两个问题: (1)CAS算法仍然可能会出现冲突,例如A、B两个线程,A已经进入写内存但未完成,此时A读取到的副本且读取成功,AB两个线程同时进入写内存操作,必然会造成冲突。 CAS算法本质并非完全无锁,而是把获得锁和释放锁推迟至CPU原语实现,相当于尽可能的缩小了锁的范围;直接互斥地实现系统状态的改变,它的使用基本思想...
Java提供了许多数据结构来处理并发编程中的线程安全问题。其中之一就是线程安全的Map。在并发编程中,多个线程往往会同时访问和修改共享的数据结构,如果没有正确的同步机制,就会导致不确定的结果或者数据的损坏。线程安全的Map可以保证在多线程环境下,对共享数据的读写操作都是安全的。
我接触到的并发缺陷绝大部分是因为线程安全问题导致的,还有一些数据库锁的问题(这个不擅长)这里就不分享了。
原来如此,两个线程交替执行了。 step2:如何解决高并发场景下i++不安全的问题?变量上加个volatile关键字试试。 看哪吒前段时间分享的高并发系列文章,好像有一个关键字volatile,感觉挺好用,试试看。 我记得是这样的: volatile 关键字来保证可见性和禁止指令重排。volatile 提供 happens-before 的保证,确保一个线程的...
public boolean isRepeatSubmit(HttpServletRequest request) throws Exception { // 本次参数及系统时间 String nowParams = JSON.marshal(request.getParameterMap()); Map<String, Object> nowDataMap = new HashMap<String, Object>(); nowDataMap.put(REPEAT_PARAMS, nowParams); ...