非线程安全 先说下为什么是非线程安全的? 从Java内存模型说起# Java内存模型规定了所有的便利都存储在主内存中,每个线程还有自己的工作内存,工作内存中保存了该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,不能直接读写主内存中的变量。不同的线程之间的也无法直接访问对方的工作内...
从上面的分析可知,i = i++语句的执行过程有多个操作组成,不是原子操作,因此不是线程安全的。 在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字。而java.util.concurrent.AtomicInteger是一个提供原子操作的Integer类,其提供了线程安全且高效的原子操作,是线程安全的。
由于线程共享栈区,不共享堆区和全局区,所以当且仅当 i 位于栈上是安全的,反之不安全。 2. AtomicInteger 和 各种 Lock 都可以确保线程安全。AtomicInteger 的效率高是因为它是互斥区非常小,只有一条指令,而 Lock 的互斥区是拿锁到放锁之间的区域,至少三条指令。 原文链接:http://group.jobbole.com/26557/...
1、如果i是局部变量(在方法里定义的),那么是线程安全的。因为局部变量是线程私有的,别的线程访问不到,其实也可以说没有线程安不安全之说,因为别的线程对他造不成影响。 2、如果i是全局变量(类的成员变量),那么是线程不安全的。因为如果是全局变量的话,同一进程中的不同线程都有可能访问到。 如果有大量线程同...
i = i + 1 和 i++ 还不一样,分了4步,所以也是线程不安全的。...java 代码解读复制代码// 内存偏移地址// objectFieldOffset 返回指定的变量在所属类中的内存偏移地址,该偏移地址仅仅在该Unsafe函数中访问指定字段时使用。 7610 Java并发 - Java core I...
我这里就说一下结论,通过对比分析,我们会发现,2*i*i 进行了大量的堆栈操作,因此,需要保存大量的中间结果;而 2*(i*i) 只有少量的堆栈操作。 显而易见,2*(i*i) 比 2*i*i 快是由于 JIT 优化的结果。 -END-
不安全。每个线程都有自己的工作内存,每个线程需要对共享变量操作时必须把共享变量从主内存中加载到自己的工作内存。等完成操作再保存到内存中。如果一个线程运算完成后还没刷到主内存中,另一个线程又对这个共享变量进行操作,那么读取到的数据就是脏数据了。 3. object的hash该怎么设计 hash方法 - (NSUInteger)hash...
StringBuffer是线程安全的,而StringBuilder是线程不安全的 13.对于如下代码: String s1 = "a"; String s2 = s1 + "b"; String s3 = "a" + "b"; System.out.println(s2 == "ab"); System.out.println(s3 == "ab"); 第一条语句打印的结果为false,s2=a1+"b",相当于构建了一个新的string对象,...
StringBuffer和StringBuilder 好处都是对象可以多次被修改(String类型的对象创建成功后不能被修改,平时使用看着可以修改,是因为又new了一个新对象,再把变量指到新的),不产生新的未使用对象,StringBuilder效率更高速度更快,多数情况使用StringBuilder;只用有线程安全要求时使用StringBuffer...
4.12 Spring框架中的单例bean是线程安全的吗? 4.13 解释Spring框架中bean的生命周期 说一下动态代理和静态代理?动态代理有JDK动态代理和Cglib动态代理,这两个代理如何实现的,有何区别? 5 设计模式 5.1 策略模式 5.2 项目中用到了那些设计模式?哪些好的框架里面有使用过这些设计模式?