s=s+1,s+=1,++1,1++没有区别?

简介: s=s+1,s+=1,++1,1++没有区别?

s=s+1,s+=1,++1,1++没有区别?

有人觉得s=s+1;和s+=1;没什么区别,都是s+1然后在赋值给s,没什么区别,但是++1,和1++是有区别。++1是先加1在赋值,1++是先赋值后加1。真的是这样吗?

s=s+1,s+=1

我们举个例子来验证,short s = 1; s = s + 1;有错吗?s += 1;有错吗?
是不是感觉很面熟,这个不是常见的面试题吗?那你们知道答案吗?
答案
short s = 1; s = s + 1;由于1是int类型,因此s + 1运算结果也是int型,需要强制转换类型才能赋值给short型。而short s = 1; s += 1;可以正确编译,因为s += 1;相当于s = (short)(s + 1);其中有隐含的强制类型转换。

惊不惊喜,意不意外。

++1,1++

这个我是不是不用多说了,和前面说的一样++1是先加1在赋值,1++是先赋值后加1。我的问题不再这个,而是++1,1++线程安全吗?

不知道了吧,小子,嘿嘿。
测试代码

public class Test {

    static int count1 = 0;
    static int count2 = 0;
    static CountDownLatch countDownLatch = new CountDownLatch(100);

    public static void main(String[] args) throws InterruptedException {
        TestRunnable testRunnable = new TestRunnable();
        for (int i = 0; i < 100; i++) {
            new Thread(testRunnable).start();
        }
        countDownLatch.await();
        System.out.println("count1:" + count1);
        System.out.println(count2);
    }

    static class TestRunnable implements Runnable {

        private void count() {
            for (int i = 0; i < 1000; i++) {
                count1++;
                count2++;
            }
        }

        @Override
        public void run() {
            count();
            countDownLatch.countDown();
        }
    }
}

运行结果

//第一次
count1:98867
count2:99013
//第二次
count1:99821
count2:99828
//第三次
count1:100000
count2:100000
//第四次
count1:99672
count2:99682
第五次
count1:98500
count2:98503

是不是知道了,但是知道原因吗?

原因
该语句执行过程如下,先把 i 的值取出来放到栈顶,可以理解为引入了一个第三方变量 k,此时,k的值为i,然后执行自增操作,i的值变为1,最后执行赋值操作 i = k (自增前的值)因此执行结束后,i的值还是0。从上面的分析可知,i = i++语句的执行过程有多个操作组成,不是原子操作,因此不是线程安全的。

解决办法
java.util.concurrent.AtomicInteger是一个提供原子操作的Integer类,其提供了线程安全且高效的原子操作,是线程安全的。当然不止Integer Atomic包有很多线程安全操作,这个需要读者自己去探索。

相关文章
|
数据安全/隐私保护 虚拟化 Windows
如何在 VM 虚拟机中安装 Windows 7 操作系统保姆级教程(附链接)
如何在 VM 虚拟机中安装 Windows 7 操作系统保姆级教程(附链接)
如何在 VM 虚拟机中安装 Windows 7 操作系统保姆级教程(附链接)
|
Java 关系型数据库 MySQL
学生公寓报修管理系统的设计与实现(论文+源码)_kaic
学生公寓报修管理系统的设计与实现(论文+源码)_kaic
|
Java API Android开发
Android native应用开发简明教程 (1) - 本地开发武器库概览
native应用比起Java应用来,跟Android版本的相关性更高一些。 所以,这些API都是根据平台版本号分成不同的目录的。 我们来看看Android为我们提供了哪些API
6625 0
|
10月前
|
传感器 监控 物联网
物联网与虚拟现实:未来技术趋势与应用
随着科技的不断进步,新兴技术如物联网(IoT)和虚拟现实(VR)正在逐步改变我们的生活、工作以及娱乐方式。本文旨在探讨这些前沿技术的发展趋势及其在多个行业的潜在应用场景,分析其对社会发展的深远影响,并对未来的发展方向进行展望。通过详细分析,本文揭示了物联网和虚拟现实如何共同推动社会进步,并带来创新和可能性。
|
10月前
|
开发者 Python
如何在Python中管理模块和包的依赖关系?
在实际开发中,通常会结合多种方法来管理模块和包的依赖关系,以确保项目的顺利进行和可维护性。同时,要及时更新和解决依赖冲突等问题,以保证代码的稳定性和可靠性
315 62
|
9月前
|
C语言 开发者
【C语言】数学函数详解
在C语言中,数学函数是由标准库 `math.h` 提供的。使用这些函数时,需要包含 `#include <math.h>` 头文件。以下是一些常用的数学函数的详细讲解,包括函数原型、参数说明、返回值说明以及示例代码和表格汇总。
282 6
|
7月前
|
人工智能 自然语言处理 物联网
阿里万相重磅开源,人工智能平台PAI一键部署教程来啦
阿里云视频生成大模型万相2.1(Wan)重磅开源!Wan2.1 在处理复杂运动、还原真实物理规律、提升影视质感以及优化指令遵循方面具有显著的优势,轻松实现高质量的视频生成。同时,万相还支持业内领先的中英文文字特效生成,满足广告、短视频等领域的创意需求。阿里云人工智能平台 PAI-Model Gallery 现已经支持一键部署阿里万相重磅开源的4个模型,可获得您的专属阿里万相服务。
|
10月前
|
机器学习/深度学习 存储 人工智能
政务部门人工智能OCR智能化升级:3大技术架构与4项核心功能解析
本项目针对政务服务数字化需求,建设智能文档处理平台,利用OCR、信息抽取和深度学习技术,实现文件自动解析、分类、比对与审核,提升效率与准确性。平台强调本地部署,确保数据安全,解决低质量扫描件、复杂表格等痛点,降低人工成本与错误率,助力智慧政务发展。
313 0
|
10月前
|
网络协议 安全 网络安全
OSPF的安全性考虑:全面解析与最佳实践
OSPF的安全性考虑:全面解析与最佳实践
302 0

热门文章

最新文章