Java 中 ++ 操作符的线程安全
2017-11-24 19:20
351 查看
今天看到一道面试题:Java 中 ++ 操作符是线程安全的吗?
答案:不是线程安全的操作。它涉及到多个指令,如读取变量值,增加,然后存储回内存,这个过程可能会出现多个线程交差。
对于此答案进行拓展:查到了一些关于i++的线程安全的有关知识:
说起原子性的操作,是指读和写是原子性的,比如i=5;这个就是一个原子性的操作。
但是两个原子性的操作合在一起进行,就不一定是原子性的了,比如先读后写,那么就有可能在读之后这个变量被修改过。
i++就是这样的一个操作,先读后写,所以说整型变量是原子性的,不是说i++就是一个原子性的操作。
[b]在多线程的情况下:当你使用for(int i=0; i<10000; i++){System.out.print(i)}[/b]
你会发现,i到最后不会打印出10000,打印出8-9千个数字左右。
所以说在多线程的情况下,就算整型变量是原子性的,也有可能会出现线程安全的问题,这个是线程可见性的问题,所以需要加上volatile声明才行,
该修饰符是强制变量每次从内存中读取,而不会存储在寄存器中。
答案:不是线程安全的操作。它涉及到多个指令,如读取变量值,增加,然后存储回内存,这个过程可能会出现多个线程交差。
对于此答案进行拓展:查到了一些关于i++的线程安全的有关知识:
说起原子性的操作,是指读和写是原子性的,比如i=5;这个就是一个原子性的操作。
但是两个原子性的操作合在一起进行,就不一定是原子性的了,比如先读后写,那么就有可能在读之后这个变量被修改过。
i++就是这样的一个操作,先读后写,所以说整型变量是原子性的,不是说i++就是一个原子性的操作。
[b]在多线程的情况下:当你使用for(int i=0; i<10000; i++){System.out.print(i)}[/b]
你会发现,i到最后不会打印出10000,打印出8-9千个数字左右。
所以说在多线程的情况下,就算整型变量是原子性的,也有可能会出现线程安全的问题,这个是线程可见性的问题,所以需要加上volatile声明才行,
该修饰符是强制变量每次从内存中读取,而不会存储在寄存器中。
相关文章推荐
- Java设计模式——线程安全的单件模式
- Java多线程____线程安全问题
- java中线程安全问题
- Java操作符
- 一道JAVA面试,线程安全和静态内部类
- Java集合中那些类是线程安全的
- [Thinking_in_Java] 操作符 —— Operator
- JAVA 线程安全 秘笈
- Java并发编程---线程安全问题
- 对java中File.mkdirs方法线程安全问题的一点探讨
- Java多线程理解:线程安全的集合对象
- Java与线程安全
- Rx_java(6)Rx_java2操作符(debounce 、filter 、switchMap )介绍-搜索功能小案例
- java进程、线程、多线程以及线程安全问题
- java编程思想---第三章(操作符)
- java 成员变量的线程安全
- Java并发基础(三)-线程安全
- Java基础总结 - 线程安全的Map
- java的线程安全、单例模式、JVM内存结构等知识学习和整理
- Java五种单例模式与线程安全