首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

搞不懂,Synchronized锁在Spring事务管理下,为啥还线程不安全?

1,没有使用悲观锁和乐观锁,但是在业务层方法上加了synchronized关键字,问题是代码执行完毕后数据库中的money 字段不是10000,而是小于10000 问题出在哪里?...一、我的思考 既然测试出来的结果是低于1000,那说明这段代码不是线程安全的。不是线程安全的,那问题出现在哪呢?...根据上面的分析,我怀疑是提问者没测试好(hhhh,逃),于是我也跑去测试了一下,发现是以提问者的方式来使用是真的有问题。...二、图解出现的原因 发现并不是同步执行的,于是我就怀疑synchronized关键字和Spring肯定有点冲突。于是根据这两个关键字搜了一下,找到了问题所在。...在多线程环境下,就可能会出现:方法执行完了(synchronized代码块执行完了),事务还没提交,别的线程可以进入被synchronized修饰的方法,再读取的时候,读到的是还没提交事务的数据,这个数据不是最新的

95010

Synchronized锁在Spring事务管理下,为啥还线程不安全?

这是为什么呢? 一、我的思考 既然测试出来的结果是低于1000,那说明这段代码不是线程安全的。不是线程安全的,那问题出现在哪呢?...根据上面的分析,我怀疑是提问者没测试好(hhhh,逃),于是我也跑去测试了一下,发现是以提问者的方式来使用是真的有问题。...二、图解出现的原因 发现并不是同步执行的,于是我就怀疑synchronized关键字和Spring肯定有点冲突。于是根据这两个关键字搜了一下,找到了问题所在。...我测试的代码中synchronized是修饰在方法上的,按我的推断:应该是synchronized锁释放后,事务提交前这时间间隔内才会出现线程安全问题(别的线程偷偷跑进去了)。...总体来看,我认为思路是没有问题的,但出现上面的结果是我没考虑到的,如果知道为什么会出现这种情况的同学不妨在评论区留言告诉我。

74760
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    来自一位五年Android工程师APK体积优化的一些总结

    如果我单写顶上那一句,会在相应的文件夹下生成出图片,但是加上后面这句,相应的图片就没有了!我就好奇了,为什么呢?然后我找到了相应的手机试了一下,加不加上面这句没有什么卵用!我是在19版本上测试的!...其实真的很简单,只要在展示的图片中添加 app:tint="颜色值" 这样就可以改变图片的颜色,那么状态选择器呢?怎么用呢?其实很简单了!下面我们来看代码! 先来看看两个状态选择器的代码: 真的不知道为什么还要保留?处于什么原因呢?还请懂的大神指点!!! 6. 代码混淆 关于这个我不准备在这里讲,代码混淆网上一搜一大把!...然后你再webp就可以了!其实我个人觉得,除非引导图等...比较大的图,否则没有必要使用webp!个人感觉而已。。。 8. 资源混淆 关于资源混淆基本上是美团和微信的两大方案,我还在整理!...微信的方案开源了! 美团的貌似是没有开源,但是在相应的技术博客中写了 等整理好了之后在贴出来! 基本上我现在的项目体积优化的话,就弄了这么多,还请大佬们指点!!!

    1.6K31

    Synchronized锁在Spring事务管理下,为啥还线程不安全?

    开启10000个线程,每个线程给员工表的money字段【初始值是0】加1,没有使用悲观锁和乐观锁,但是在业务层方法上加了synchronized关键字,问题是代码执行完毕后数据库中的money 字段不是...一、我的思考 既然测试出来的结果是低于1000,那说明这段代码不是线程安全的。不是线程安全的,那问题出现在哪呢?...根据上面的分析,我怀疑是提问者没测试好(hhhh,逃),于是我也跑去测试了一下,发现是以提问者的方式来使用是真的有问题。...二、图解出现的原因 发现并不是同步执行的,于是我就怀疑synchronized关键字和Spring肯定有点冲突。于是根据这两个关键字搜了一下,找到了问题所在。...在多线程环境下,就可能会出现:方法执行完了(synchronized代码块执行完了),事务还没提交,别的线程可以进入被synchronized修饰的方法,再读取的时候,读到的是还没提交事务的数据,这个数据不是最新的

    43220

    Android Hook技术的学习经历分享

    在我没有搞明白之前,也觉得简直了,我的方法里边不调用他的代码,他怎么能够执行他的方法? 今天,我告诉你:这是真的。 只讲学习过程 不要激动,今天不打算就开始分享这方面的技术,先来个前凑吧!...虽然平时我挺爱学习,但是一看要搞这个事情,大部分都是低层的东西,让我也是望而却步,只不过我不干,也找不到第二个人来上,只能迎着头皮上,三个字:就是干。...总结:畏惧很正常,给自己一个干的借口 准备工作 要开始对它的学习,首先得指导它的机制,这方面网络上资料倒是挺多的,我的理解是: 在程序运行时,注入到程序进程中,查找要捕获的方法的地址,然后劫持它,让它跳转到自己的方法来执行...Google是好帮手 非常感谢这个时代,知识的获取真的太容易了,我找到了相关的诸多信息进行一一了解。确发现很多资料停留在15年以前,而且更多的是只言片语。...最后选择了 cydia substrate,其实二者完全可以结合起来使用,实现更为强大的功能。

    1.6K31

    synchronized+Spring事务,为啥还线程不安全呢?

    from yuanyuan 海南 结论: 如果在synchronized修饰的方法上添加AOP特性,那么这个方法也不是线程安全的,因为出现了两个原子操作: (1)synchronized修饰的代码块中的操作...【线程安全】 (2)AOP中的commit操作【线程安全】 线程1在执行synchorinized的代码块时, 线程2在执行commit操作!...这是为什么呢? 一、我的思考 既然测试出来的结果是低于1000的,那说明这段代码是非线程安全的。 不是线程安全的?那问题在哪呢!...我测试的代码中synchronized是修饰在方法上的,按我的推断:应该是synchronized锁释放后,事务提交前这时间间隔内才会出现线程安全问题(别的线程偷偷跑进去了)。...总体来看,我认为思路是没有问题的,但出现上面的结果是我没考虑到的,如果知道为什么会出现这种情况的同学不妨在评论区留言告诉我。

    28420

    最终版 Reflector v1.0 (+简单的反流程混淆)

    那个路径,是vs所在路径,选择需要的功能,然后Extract…… ? ? ? 12,增加简单的反流程混淆功能 ? ? ? ?    ...我找到问题所在后,发现根本无法补救,因为Reflector可以说压根就没有AST!...做了一个尝试,把多余的跳转全部干掉,结果Reflector的分析过程相当脆弱……最后,在进行指令分析之前,增加一块功能,根据强跳转给指令来一个排序,排序后,每一个强跳转,实际上就是下一句,然后再花最小的代价增强...Reflector的分析功能(因为它还是脆弱得立马崩溃……)     写到最后,忽然间想起来,我在08年做过反名称混淆和反流程混淆的工具,基于Cecil,离开上海后不知道代码丢哪里去了。...当然,我的工具还有一些非常具有特色的功能,移植到Reflector是不可能了,因为Reflector的架构真的很糟糕!     同根生与Cecil,我很看好ILSpy!

    84850

    app 安全和ios及安卓马甲包代码混淆的demo的手把手教你的详细教程

    )为什么要进行代码混淆 二)代码混淆的两种方法(①宏替换 ②脚本实现替换) 三)代码混淆参考的博客及说明 1)为什么要进行代码混淆?...因为在工程中,我们这些变量或函数命名都是有一定可读性的,例如跟用户名相关的,那一般里面会有 userName,跟密码相关的一般会有 passWord,这样定义也是为了我们自己代码可读性更强,我们修改的时候才更加的方便...很多人实现用Hopper搞定Mac迅雷的会员以及离线下载功能等等逆向工程,这些逆向之所以成功,是因为这些微信和迅雷的实现这些功能的核心代码没有进行代码混淆,如果进行了代码混淆,即使逆向了,找不到实现功能的函数...还有更重要的原因:某一天某安全公司给你发一份安全测试报告,你的代码没做混淆(当然不只这一个风险),存在安全风险,boss 听说有风险肯定让你解决这个问题啊,我们公司就是这样的情况,我才做的的代码混淆的!...基本上就搞定了,剩下的就是添加上我们想要混淆的变量名或函数名 第四、在 func.list 文件里,写入待混淆的函数名如果像下面这几个属性跟函数: 需要混淆的属性跟函数名那么就这在 fun.list

    3.5K10

    Nuwa学习笔记

    理论上,如果在不同的dex中有相同的类存在,那么会优先选择排在前面的dex文件的类,如下图: ?...让我们搜索一下抛出错误的代码所在,嘿咻嘿咻,找到了一下代码: ? 从代码上来看,如果两个相关联的类在不同的dex中就会报错,但是拆分dex没有报错这是为什么,原来这个校验的前提是: ?...这段代码是dex转化成odex(dexopt)的代码中的一段,我们知道当一个apk在安装的时候,apk中的classes.dex会被虚拟机(dexopt)优化成odex文件,然后才会拿去执行....所以Application作为应用的入口不能插入这段代码。...(因为载入hack.dex的代码是在Application中onCreate中执行的,如果在Application的构造函数里面插入了这段代码,那么就是在hack.dex加载之前就使用该类,该类一次找不到

    92020

    你是一名专业人士吗?

    没过多久,现场人员打来电话, 现场人员: 王工,你们的服务不正常已经影响到用户的正常使用了,你看看尽快处理下。...(各种搜索和尝试) 晚上九点后打了个电话,告诉现场人员问题已经解决了,原因是线程打满了,更新一个文件就OK了..... 问题真的彻底解决了吗? 线上环境出现这个问题的真正原因是什么?...你花了将近一天的时间去解决一个bug,为了解决这个bug 你 修修补补,给后人留下了一堆无法扩展的代码,解决完成后自己不痛不痒的回家玩玩游戏,睡睡觉,然后时不时抱怨工资真特么低,天天还得拼死拼活加班干。...网上的方法果然好使,存成书签,程序员这种工作果然好干,其实没啥,只要搜索引擎用的好,原来可以胜任一切工作,其实真的是这样吗?出了问题你有自己的一套解决问题的办法吗?如果网上找不到答案怎么办?...甚至在编程的时候避免这种问题吗? 如何高效率解决问题? 首先面对一个问题,要认真思考,为什么会出现这种问题?还是过程的某几个环节出现了问题?

    45210

    为什么我避免使用asyncawait?

    这在客观上是正确的,但在大多数情况下,我不认为async/await真的能解决这个问题。谎言和async/await我用来确定是否要使用某个模式的指标之一是它所带来的代码综合质量。...Async/await让你的异步代码看起来像同步的一样。这是它的卖点。但对我来说,这就是问题所在。它从一开始就为你的代码所发生的事情设定了错误的心理模型。...在这三种情况中,你对优化途径的假设是什么?我看了第一种情况,发现我们在两个不同的地方保存了两块不同的数据,然后只是返回一个对象。唯一可以优化的地方是保存函数。没有任何其他选择。...说实话,我第一次听到这种论调时,我以为这个人只是混淆了,是想说 "callbacks"。...但后来我真的看到了一些promise的代码,它们看起来惊人地像回调地狱。我很困惑,为什么有人会这样使用promise。最终,我得出结论,有些人对promise的工作原理有一个非常基本的误解。

    2K42

    Bruce.Wang-记一次对JS木马分析

    0×01 解混淆 首先打开 js 文件,看到的就是一个很明显的 var PAa = ""; 定义了一个变量,然后是大段的代码: 这大段的代码都是以函数执行的方式放在数组里的,我们在仔细看一下数组第一个元素...然后拼接到开始定义的 PAa 这个变量中,最后 eval 执行这段代码,那毫无疑问,最后 PAa 这个变量存储的东西就是真正的代码了。...0×03 免杀方式总结 js的混淆能力真的很强大,简单总结一下上面木马的混淆免杀方式,第一层混淆就是通过了函数返回值,数组,字典、16 进制表示字符等方式进行层层替换,得到真正的代码。...第二层混淆就是在代码执行过程中对关键字进行字符串的拼接,躲避对关键字的查杀,简单而有效。...0×04 后记 由于找不到下载到本地的恶意代码文本,特意到网上搜了N个该 JS 的特征代码。

    1.3K60

    记一次JS木马分析

    当运用在 web 开发上时,增加了更多的动态功能和效果,极大的改善了用户体验。但是,随着 js 的功能强大的同时,也带来了更多的安全隐患。...然后拼接到开始定义的 PAa 这个变量中,最后 eval 执行这段代码,那毫无疑问,最后 PAa 这个变量存储的东西就是真正的代码了。...0x03 免杀方式总结 js 的混淆能力真的很强大,简单总结一下上面木马的混淆免杀方式,第一层混淆就是通过了函数返回值,数组,字典、16 进制表示字符等方式进行层层替换,得到真正的代码。...第二层混淆就是在代码执行过程中对关键字进行字符串的拼接,躲避对关键字的查杀,简单而有效。...0x04 后记 由于找不到下载到本地的恶意代码文本,特意到网上搜了N个该 JS 的特征代码。

    4.3K80

    一天测试两个接口很满意

    这段时间一直在某研究院做集成测试,虽然偶目前只是打个副手(囧),不过作为一个旁观者很是清楚大家的工作效率。 一套系统的两个子系统,通过webservice进行交互,早先定好的标准此时已经改变。...其实这也不是问题,写代码的效率要远高于测试效率。 花一个小时写好代码,并简单调试没有bug。然后开始部署,开始漫长的测试之旅。 其实一天测试两个接口,主要问题在于环境上。...不过我觉得工作流程也有问题,不过以我的水平,目测不出问题所在。 “改代码,本地调试,部署服务器,调用对方WebService,然后通过WebService接受对方返回来的消息。”...一遍一遍的测试流程,一点一点的排除bug,怎么着都找不到问题所在,看起来一切正常,理论上应该可以走的通。 两边的接口规范一一对应,没有出入。问题何在?...在最后大家都表示无奈的情况下,终于发现了问题所在,一个webService的调用地址的微小改变引起了这场bug跟踪大战。 在没有笔和纸的年代,记录是一件很难的事情。

    74430

    传统企业的运维之痛

    运维之痛2:流程 vs 创新 很多人会告诉我,在传统企业中没办法,我们必须通过流程来驱动各个组织角色,确保协同工作。真的如此么?我们在腾讯维护那么多产品线,没有流程怎么做到的?然后真的会混乱不堪么?...我和我之前的运维团队来说,如果你不能保持一个对外的简单清晰运维界面,那就是我们工作的失职。 流程是我们找不到解决方案的时候,添加的累赘!...我觉得这些都是附加角色,所谓的附加角色,就是在没有找到实质解决方案的情况下,不断的添加一些check角色来改进现状。真的改进了么?没有,附加角色只会是增加了事务的复杂度和后续的执行难度。 那怎么办?...糟糕的情况,组织设计完全面向问题,而非面向用户。谁能代替用户来对IT组织的考核?没有。但我们的方式恰恰相反,认为考核组就可以,针对每个小组,设计了一些指标。...传统企业的架构组应该在这个点上多思考,统一的开发框架到底包含哪些? 4、业务需求优先,非功能性需求次之 要命的是,评估一个研发团队的绩效是从实现业务的功能需求角度去考核的。

    74921

    为什么对比测试会扼杀转化率

    双尾测试考量的是在过程中可能发生的事情的积极和消极的相关性,你需要更多的数据来得到一个结论,但结论揭示了一些不同的点,这些在单尾测试中是找不到的。   但这并不总是意味着双尾测试是正确的答案。...统计学的巅峰   我曾经写过“统计学意义”,讲的是它为什么重要以及它如何影响你的测试。   许多对比测试往往在你收集足够信息之前就已推动你倾向成为赢家。...等等-我们还没有完成   以上只是大多数对比测试结束得到的结果,而我们才刚刚开始。   因为我们想看看有多少人确实注册了。要检查这一点, 我们将转化事件从“注册”转换 “订阅-新用户”。   ...点击“运行报告”,出人意外的结果是,在新用户订阅上,原型测试击败了变异测试。所以在“注册”上变异测试击败原型测试——原型测试则在转化这些新注册用户变成付费用户上有更好的表现。...在Martin Goodson的“Most Winning A/B Tests Are Illusory”指导中,举例说明了数字统计在排除假数据和混淆对比数据上的影响。

    67280

    【教程】Flutter 应用混淆

    在移动应用开发中,保护应用代码安全至关重要。Flutter 提供了简单易用的混淆工具,帮助开发者在构建 release 版本应用时有效保护代码。...摘要 本文介绍了在 Flutter 应用中使用混淆的简单方法,通过命令行参数 --obfuscate 和 --split-debug-info 的结合使用,开发者可以轻松实现应用代码的混淆。.../out/android/app.android-arm64.symbols 为什么要使用js混淆工具? 使用js混淆工具的主要目的是为了保护js代码不被轻易地反编译或破解,提高代码的安全性和稳定性。...这将会将混淆后的堆栈跟踪信息转换为易读的原始代码信息,有助于开发者快速定位问题所在。 总结 本文介绍了在 Flutter 应用中使用混淆的简单方法,并提供了操作步骤和注意事项。...通过上述方法,你可以轻松地优化 Flutter 应用的混淆,保护应用代码安全,提升用户体验,更好地应对市场竞争。如果你有任何问题或建议,欢迎在评论区留言,与我们分享你的想法!

    30810

    安卓 App 热补丁动态修复技术介绍

    最终决定使用热补丁动态修复技术,向用户下发Patch,在用户无感知的情况下,修复了外网问题,取得非常好的效果。...理论上,如果在不同的dex中有相同的类存在,那么会优先选择排在前面的dex文件的类,如下图: [image.jpg] 在此基础上,我们构想了热补丁的方案,把有问题的类打包到一个dex(patch.dex...让我们搜索一下抛出错误的代码所在,嘿咻嘿咻,找到了一下代码: [image.jpg] 从代码上来看,如果两个相关联的类在不同的dex中就会报错,但是拆分dex没有报错这是为什么,原来这个校验的前提是:...让我们在继续搜索一下代码,嘿咻嘿咻~,在DexPrepare.cpp找到了一下代码: [image.jpg] 这段代码是dex转化成odex(dexopt)的代码中的一段,我们知道当一个apk在安装的时候...(因为载入hack.dex的代码是在Application中onCreate中执行的,如果在Application的构造函数里面插入了这段代码,那么就是在hack.dex加载之前就使用该类,该类一次找不到

    3.3K10

    我闻到了 Android AppCompat 代码的坏味道!

    我们看到前面截图中,错误显示是在某一处的代码通过反射去获取 ActivityCompatApi23 的内部类的时候,出现的错误,不难想到,由于 Api 19 没有 SharedElementCallback...好吧,出来就出来了,我也没办法把你送回去,那我们来分析一下,为什么我只是想要一个父类,结果却牵扯出来父类里面的一个静态内部类的父类找不到的问题?...其实是有问题的,因为这段代码本身就是运行在 AppCompatActivity 的子类中的,也就是说这时候 AppCompatActivity 肯定早就完成了类加载,相应的,在它加载链接的过程中,它的父类们也通通会被加载到虚拟机中...,那么我所谓的便利导致了这些父类的加载实际上是不对的。...在 Api 19 当中,我们看到这里明确地去访问了外部类去创建 classId,这一点导致了外部类的加载。 ?

    64510

    【新技能get】让App像Web一样发布新版本

    背景 当一个App发布之后,突然发现了一个严重bug需要进行紧急修复,这时候公司各方就会忙得焦头烂额:重新打包App、测试、向各个应用市场和渠道换包、提示用户升级、用户下载、覆盖安装。...理论上,如果在不同的dex中有相同的类存在,那么会优先选择排在前面的dex文件的类,如下图: ?...从代码上来看,如果两个相关联的类在不同的dex中就会报错,但是拆分dex没有报错这是为什么,原来这个校验的前提是: ?...这段代码是dex转化成odex(dexopt)的代码中的一段,我们知道当一个apk在安装的时候,apk中的classes.dex会被虚拟机(dexopt)优化成odex文件,然后才会拿去执行....(因为载入hack.dex的代码是在Application中onCreate中执行的,如果在Application的构造函数里面插入了这段代码,那么就是在hack.dex加载之前就使用该类,该类一次找不到

    663130
    领券