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

MyBatis一级缓存的脏数据——MyBatis迷信者,清醒点之二

MyBatis盲目迷信、不愿看清事实的技术拳民请出门左转 如果将localCacheScope设为SESSION(默认),通过SqlSession(或Mapper)查询得到的返回都会被缓存在一级缓存中...下面是NewsMapper组件的XML映射文件。 <!...上面程序在cacheTest()方法中增加了一条Thread.sleep(10)的代码,这行代码是为了让线程调度在此处切换。...] org.crazyit.app.dao.NewsMapper.getNews <== Total: 1 [java] 李刚的公众号 从上面运行日志可以清楚地看到:A线程此处main线程模拟...)第二次读取id为1的News对象时,MyBatis并未重新读取数据表中最新的数据,而是依然使用缓存中的id为1的News对象——但请记住:此时B线程此处用Thread-0线程模拟)已经修改了数据表中

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

浅谈Volatile与JMM

Java 内存模型规定了所有的变量都存储在主内存中(此处的主内存与介绍物理硬件时的主内存名字一样,两者可以互相类比,但此处仅是虚拟机内存的一部分)。...不允许一个线程无原因地(没有发生过任何 assign 操作)把数据从线程的工作内存同步回主内存中。...如果一个变量实现没有被 lock 操作锁定,则不允许对它执行 unlock 操作,也不允许去 unlock 一个被其他线程锁定的变量。...当一个线程修改了工作内存中的共享变量后,需要将修改后的刷新到主内存中,以便其他线程能够看到更新后的。...这种情况下,当另一个线程访问该对象时,可能会出现异常或不正确的行为。为了解决指令重排序的问题,需要使用volatile关键字。

13910

【Java编程进阶之路 01】深入探索:HashMap、ConcurrentHashMap与HashTable的演进之路

特点:HashMap 提供了最好的性能,但不保证映射的顺序,也不提供线程安全。...null作为键和 ConcurrentHashMap不允许使用null作为键和,ConcurrentHashMap是线程安全的,但它的设计并不是为了在每个方法上都加同步锁,而是通过在内部使用分段锁或其他并发控制机制来实现高效的并发访问...} } 3.2 HashTable不允许使用null作为键或 HashTable不允许使用null作为键或。...实际上允许null作为,但不允许null作为键。...实际上,HashTable允许使用null作为,但是不允许使用null作为键。如果尝试使用null作为键,将会抛出NullPointerException。

13210

JMM内存模型介绍「建议收藏」

此处的变量(Variables)与Java编程中所说的变量有所区别,它包括了实例字段、静态字段和构成数组对象的元素,但是不包括局部变量与方法参数,因为后者是线程私有的,不会被共享,自然就不会存在竞争问题...Java内存模型规定了所有的变量都存储在主内存(Main Memory)中(此处的主内存与介绍物理硬件时提到的主内存名字一样,两者也可以类比,但物理上它仅是虚拟机内存的一部分)。...4.Java内存模型与硬件内存架构的关系 通过对前面的硬件内存架构、Java内存模型以及Java多线程的实现原理的了解,我们应该已经意识到,多线程的执行最终都会映射到硬件处理器上进行执行,但Java内存模型和硬件内存架构并不完全一致...不允许一个线程无原因地(没有发生过任何assign操作)把数据从线程的工作内存同步回主内存中。...如果一个变量事先没有被lock操作锁定,那就不允许对它执行unlock操作,也不允许去unlock一个被其他线程锁定的变量。

1.2K20

C++基础 多线程笔记(一)

,程序仍会直接退出,join没有起到应有的作用,这是可以通过try-catch异常捕获机制,结合join方法,使某些函数(子线程)在程序出现异常时也能先执行完毕再退出,例子如下,通过OpenCV读取显示一张不存在的图片产生异常...("1.jpg");//读取一张不存在的图片,使下句的图片显示出现异常 cv::imshow("===", img);//此处出现异常!?...//出现异常会导致整个程序直接退出 //捕获异常后,可以进行补救,如使t1子线程执行完毕。 } catch (...)..."主程序正常退出" << std::endl; return 0; } 可以看出运行后产生了一个OpenCV Error,没能输出"主程序正常退出" ,但子线程在程序出现异常后依然可以继续执行完毕...========Hello=======2 ========Hello=======3 ========Hello=======4 ========Hello=======5 此处省略...

57620

Python新手学习raise用法

下面示例示范了处理用户引发异常的两种方式: def main(): try: # 使用try...except来捕捉异常 # 此时即使程序出现异常,也不会传播给main函数...) def mtd(a): if a 0: raise ValueError("a的大于0,不符合要求") main() 从上面程序可以看到,程序既可在调用 mtd(3) 时使用 try...运行上面程序,可以看到如下输出结果: 程序出现异常: a的大于0,不符合要求 Traceback (most recent call last): File “C:\Users\mengma\Desktop...“C:\Users\mengma\Desktop\1.py”, line 12, in mtd raise ValueError(“a的大于0,不符合要求”) ValueError: a的大于...raise AuctionException(e) if self.init_price d: raise AuctionException("竞拍价比起拍价低,不允许竞拍

5.5K30

Java从入门到精通八(Java数据结构--Map集合)

如果多个线程同时访问一个哈希映射,而其中至少一个线程从结构上修改了该映射,则它必须 保持外部同步。...但是Hashtable就不一样了,它的线程是同步的,在读写上面进行了加锁的操作。 另外HashMap是允许存放空的,但是Hashtable是绝对不允许这样做。...如果多个线程同时访问链接的哈希映射,而其中至少一个线程从结构上修改了该映射,则它必须 保持外部同步。这一般通过对自然封装该映射的对象进行同步操作来完成。...如果多个线程同时访问一个映射,并且其中至少一个线程从结构上修改了该映射,则其必须 外部同步。(结构上的修改是指添加或删除一个或多个映射关系的操作;仅改变与现有键关联的不是结构上的修改。)...返回TreeMap的所有键/映射(条目)的集合(此处方法一如以上使用方式) keySet() - 返回TreeMap的所有键的集合(获取到键) values() - 返回TreeMap的所有图的集合

70210

阿里Java编码手册实战详解-集合处理篇

10); notGenerics.add(new Object()); notGenerics.add(new Integer(1)); generics = notGenerics; // 此处抛出...反例:下例中没有处理相等的情况,交换两个对象判断结果并不互反,不符合第一个条件,在实际使用中 可能会出现异常。...【推荐】高度注意 Map 类集合 K/V 能不能存储 null 的情况,如下表格: 集合类 Key Value Super 说明 Hashtable 不允许为 null 不允许为 null Dictionary...线程安全 ConcurrentHashMap 不允许为 null 不允许为 null AbstractMap 锁分段技术(JDK8:CAS) TreeMap 不允许为 null 允许为 null...AbstractMap 线程不安全 HashMap 允许为 null 允许为 null AbstractMap 线程不安全 反例:由于 HashMap 的干扰,很多人认为 ConcurrentHashMap

65521

阿里Java编码手册实战详解-集合处理篇

10); notGenerics.add(new Object()); notGenerics.add(new Integer(1)); generics = notGenerics; // 此处抛出...反例:下例中没有处理相等的情况,交换两个对象判断结果并不互反,不符合第一个条件,在实际使用中 可能会出现异常。...【推荐】高度注意 Map 类集合 K/V 能不能存储 null 的情况,如下表格: 集合类 Key Value Super 说明 Hashtable 不允许为 null 不允许为 null Dictionary...线程安全 ConcurrentHashMap 不允许为 null 不允许为 null AbstractMap 锁分段技术(JDK8:CAS) TreeMap 不允许为 null 允许为 null...AbstractMap 线程不安全 HashMap 允许为 null 允许为 null AbstractMap 线程不安全 反例:由于 HashMap 的干扰,很多人认为 ConcurrentHashMap

87900

深入理解 Java 异常

Throwable 包含了其线程创建时线程执行堆栈的快照,它提供了 printStackTrace() 等接口用于获取堆栈跟踪数据等信息。...示例: public class RuntimeExceptionDemo { public static void main(String[] args) { // 此处产生了异常...: 出现异常了:java.lang.ArithmeticException: / by zero 不管是否出现异常,都执行此代码 5....异常和线程 如果 Java 程序只有一个线程,那么没有被任何代码处理的异常会导致程序终止。如果 Java 程序是多线程的,那么没有被任何代码处理的异常仅仅会导致异常所在的线程结束。 7....尽量不要在 finally 块抛出异常或者返回 不要忽略异常,一旦捕获异常,就应该处理,而非丢弃 异常处理效率很低,所以不要用异常进行业务逻辑处理 各类异常必须要有单独的日志记录,将异常分级,分类管理

78230

HashMap与HashTable区别

1 HashMap不是线程安全的 hastmap是一个接口 是map接口的子接口,是将键映射的对象,其中键和都是对象,并且不能包含重复键,但可以包含重复。...HashMap允许null key和null value,而hashtable不允许。 2  HashTable是线程安全的一个Collection。...,则返回 true isEmpty()如果 Map 不包含键-映射,则返回 true size()返回 Map 中的键-映射的数目 这些都代表了Java中的集合,这里主要从其元素是否有序,是否可重复来进行区别记忆...Map是一种把键对象和对象进行关联的容器,而一个对象又可以是一个Map,依次类推,这样就可形成一个多级映射。...对于键对象来说,像Set一样,一个Map容器中的键对象不允许重复,这是为了保持查找结果的一致性;如果有两个键对象一样,那你想得到那个键对象所对应的对象时就有问题了,可能你得到的并不是你想的那个对象,

78960

CompletableFuture详解

如果主线程需要执行一个很耗时的计算任务,我们就可以通过future把这个任务放到异步线程中执行。主线程继续处理其他任务,处理完成后,再通过Future获取计算结果。...某个任务执行完成后,执行回调方法;但是前后两个任务没有参数传递,第二个任务也没有返回 public static void main(String[] args) throws ExecutionException...,会触发回调方法exceptionally exceptionally中可指定默认返回结果,如果出现异常,则返回默认的返回结果 public static void main(String[] args...}); System.out.println(handle.get()); } 出现异常也会接着执行,而且他可以转换返回类型,无论出不出现异常都会执行 区别 handle() whenComplete...不会把执行结果当做方法入参,且没有返回

91020

远程线程注入引出的问题

图1 执行结果 程序很简单,就是输出main函数的地址,通过调试我们看到了输出结果是0x003d1131,但是我们监视main符号的为0x003d1380!!!...图2 反汇编 地址0x011513A0出的push指令就是传递main符号的作为printf的参数,而我们看到main函数的起始地址为0x01151380,但是这里传递的为@ILT+300=0x1151131...,而符号名被映射为_main,@ILT和_main是怎么回事?...此处还有一个小细节,我们观察编译器在Debug下生成的函数的结尾处会有一连串很长的0xCC数据,即指令int 3,我猜测可能是为了对齐或者防止函数崩溃PC指针跳到非法位置来强制中断,原因暂时不追究,但是这个特征可以方便我们计算函数的长度...图 4 运行时检查 我们发现在下载函数被调用结束后编译器却调用了一个名为_RTC_CheckEsp的函数,这个函数而且还存在ILT表有映射结构(在ILT偏移520处)。

1.6K100

《编写高质量代码》学习笔记(3)

,最后终结,不可能产生本末倒置的情况,比如把一个结束状态的线程转变为新建状态,则会出现异常,例如如下代码会抛出异常: public static void main(String[] args) throws...就是实现了线程池的执行器,我们来看一个示例代码: public static void main(String[] args) throws InterruptedException {...-1         pool-1-thread-2 本次代码执行了4遍线程体,按照我们之前阐述的" 一个线程不可能从结束状态转变为可运行状态 ",那为什么此处的2个线程可以反复使用呢?...这里有两种类型的任务:具有返回(异常)的Callable接口任务和无返回并兼容旧版本的Runnable接口任务。...把等待处理的任务放到任务队列中 从任务队列中取出任务来执行 其中此处的关键是工作线程的创建,它也是通过new Thread方式创建的一个线程,只是它创建的并不是我们的任务线程(虽然我们的任务实现了Runnable

52950
领券