10)static boolean replaceAll(List list, T oldVal, T newVal) 使用一个新值替换List对象的所有旧值oldVal 3.2...,从而解决多线程并发访问集合时的线程安全问题。 ...3)static Map synchronizedMap(Map m) 返回由指定映射支持的同步(线程安全的)映射。 ...3)unmodifiableXxx(): 返回指定集合对象的不可变视图,此处的集合可以是:List,Set,Map。 上面三类方法的参数是原有的集合对象,返回值是该集合的”只读“版本。...List unmodifiableList = Collections.emptyList(); //unmodifiableList.add("java"); //添加出现异常
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线程模拟)已经修改了数据表中
Java 内存模型规定了所有的变量都存储在主内存中(此处的主内存与介绍物理硬件时的主内存名字一样,两者可以互相类比,但此处仅是虚拟机内存的一部分)。...不允许一个线程无原因地(没有发生过任何 assign 操作)把数据从线程的工作内存同步回主内存中。...如果一个变量实现没有被 lock 操作锁定,则不允许对它执行 unlock 操作,也不允许去 unlock 一个被其他线程锁定的变量。...当一个线程修改了工作内存中的共享变量后,需要将修改后的值刷新到主内存中,以便其他线程能够看到更新后的值。...这种情况下,当另一个线程访问该对象时,可能会出现异常或不正确的行为。为了解决指令重排序的问题,需要使用volatile关键字。
使用Future接口和Callable接口实现异步执行:public static void main(String[] args) {// 快速创建线程池ExecutorService executorService...executor) 复制代码runAsync()方法的参数是Runnable接口,这是一个函数式接口,不允许返回值。...// 例子public static void main(String[] args) {// 快速创建线程池ExecutorService executor = Executors.newFixedThreadPool...// 例子public static void main(String[] args) {// 快速创建线程池ExecutorService executor = Executors.newFixedThreadPool...extends T> fn)复制代码可以通过链式调用该方法来获取异常信息,并且具有返回值。如果某一个任务出现异常被exceptionally捕获到则剩余的任务将不会再执行。
特点:HashMap 提供了最好的性能,但不保证映射的顺序,也不提供线程安全。...null作为键和值 ConcurrentHashMap不允许使用null作为键和值,ConcurrentHashMap是线程安全的,但它的设计并不是为了在每个方法上都加同步锁,而是通过在内部使用分段锁或其他并发控制机制来实现高效的并发访问...} } 3.2 HashTable不允许使用null作为键或值 HashTable不允许使用null作为键或值。...实际上允许null作为值,但不允许null作为键。...实际上,HashTable允许使用null作为值,但是不允许使用null作为键。如果尝试使用null作为键,将会抛出NullPointerException。
此处的变量(Variables)与Java编程中所说的变量有所区别,它包括了实例字段、静态字段和构成数组对象的元素,但是不包括局部变量与方法参数,因为后者是线程私有的,不会被共享,自然就不会存在竞争问题...Java内存模型规定了所有的变量都存储在主内存(Main Memory)中(此处的主内存与介绍物理硬件时提到的主内存名字一样,两者也可以类比,但物理上它仅是虚拟机内存的一部分)。...4.Java内存模型与硬件内存架构的关系 通过对前面的硬件内存架构、Java内存模型以及Java多线程的实现原理的了解,我们应该已经意识到,多线程的执行最终都会映射到硬件处理器上进行执行,但Java内存模型和硬件内存架构并不完全一致...不允许一个线程无原因地(没有发生过任何assign操作)把数据从线程的工作内存同步回主内存中。...如果一个变量事先没有被lock操作锁定,那就不允许对它执行unlock操作,也不允许去unlock一个被其他线程锁定的变量。
,程序仍会直接退出,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 此处省略...
下面示例示范了处理用户引发异常的两种方式: 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("竞拍价比起拍价低,不允许竞拍
// 创建锁对象 privatestaticfinal ReentrantLock lock = new ReentrantLock(); public static void main... // 加锁操作 lock.lock(); System.out.println("Hello,ReentrantLock."); // 此处会报异常...; } } 当出现异常时锁未被正常释放,这样就会导致其他使用该锁的线程永久的处于等待状态。... // 创建锁对象 privatestaticfinal ReentrantLock lock = new ReentrantLock(); public static void main... lock.lock(); try { System.out.println("Hello,ReentrantLock."); // 此处会报异常
主要分两个接口:collection和Map 主要分三类:集合(set)、列表(List)、映射(Map) 1.集合:没有重复对象,没有特定排序方式 2.列表:对象按索引位置排序,可以有重复对象 3....映射:有一个键对象和一个值对象,键不可重复,值可以重复 hashtable 和hashmap区别 1 HashMap不是线程安全的 2 HashTable是线程安全的一个Collection。...hastmap是一个接口 是map接口的子接口,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值。...HashMap允许null key和null value,而hashtable不允许。...public class main { public static void main(String args []) { //声明map Map ma=new
如果多个线程同时访问一个哈希映射,而其中至少一个线程从结构上修改了该映射,则它必须 保持外部同步。...但是Hashtable就不一样了,它的线程是同步的,在读写上面进行了加锁的操作。 另外HashMap是允许存放空值的,但是Hashtable是绝对不允许这样做。...如果多个线程同时访问链接的哈希映射,而其中至少一个线程从结构上修改了该映射,则它必须 保持外部同步。这一般通过对自然封装该映射的对象进行同步操作来完成。...如果多个线程同时访问一个映射,并且其中至少一个线程从结构上修改了该映射,则其必须 外部同步。(结构上的修改是指添加或删除一个或多个映射关系的操作;仅改变与现有键关联的值不是结构上的修改。)...返回TreeMap的所有键/值映射(条目)的集合(此处方法一如以上使用方式) keySet() - 返回TreeMap的所有键的集合(获取到键) values() - 返回TreeMap的所有图的集合
1、TreeSet 是二差树实现的,Treeset中的数据是自动排好序的,不允许放入null值。 ...而是从自己的用于维护键-值关联的接口层次结构入手。按定义,该接口描述了从不重复的键到值的映射。...HashMap和Hashtable的区别 导读: 1 HashMap不是线程安全的 HashMap是map接口的子类,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键...HashMap允许null key和null value,而hashtable不允许。 2 HashTable是线程安全。...不允许有null的键和值 效率稍低、 方法是是Synchronize的 有contains方法方法 、Hashtable 继承于Dictionary 类 Hashtable 比HashMap 要旧
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
Throwable 包含了其线程创建时线程执行堆栈的快照,它提供了 printStackTrace() 等接口用于获取堆栈跟踪数据等信息。...示例: public class RuntimeExceptionDemo { public static void main(String[] args) { // 此处产生了异常...: 出现异常了:java.lang.ArithmeticException: / by zero 不管是否出现异常,都执行此代码 5....异常和线程 如果 Java 程序只有一个线程,那么没有被任何代码处理的异常会导致程序终止。如果 Java 程序是多线程的,那么没有被任何代码处理的异常仅仅会导致异常所在的线程结束。 7....尽量不要在 finally 块抛出异常或者返回值 不要忽略异常,一旦捕获异常,就应该处理,而非丢弃 异常处理效率很低,所以不要用异常进行业务逻辑处理 各类异常必须要有单独的日志记录,将异常分级,分类管理
1 HashMap不是线程安全的 hastmap是一个接口 是map接口的子接口,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值。...HashMap允许null key和null value,而hashtable不允许。 2 HashTable是线程安全的一个Collection。...,则返回 true isEmpty()如果 Map 不包含键-值映射,则返回 true size()返回 Map 中的键-值映射的数目 这些都代表了Java中的集合,这里主要从其元素是否有序,是否可重复来进行区别记忆...Map是一种把键对象和值对象进行关联的容器,而一个值对象又可以是一个Map,依次类推,这样就可形成一个多级映射。...对于键对象来说,像Set一样,一个Map容器中的键对象不允许重复,这是为了保持查找结果的一致性;如果有两个键对象一样,那你想得到那个键对象所对应的值对象时就有问题了,可能你得到的并不是你想的那个值对象,
如果主线程需要执行一个很耗时的计算任务,我们就可以通过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...不会把执行结果当做方法入参,且没有返回值。
图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处)。
一:Map Map用于保存具有映射关系的数据,总是以键值对的方式存储数据。 Map继承树 Map集合的key和value都可以是任何引用类型的数据。Map集合的key不允许重复,value允许重复。...(2)Hashtable不允许使用null作为key和value。...EnumMap根据key的自然顺序(枚举值在枚举类中定义的顺序)来维护键值对的次序, EnumMap不允许使用null作为key值,但允许使用null作为value。...(2)singletonXxx():返回一个值包含指定对象(只有一个或一项元素)的,不可以变的集合对象,此处的集合既可以是List,也可以是Set,还可以是Map。...此处的集合既可以是List,也可以是Set,还可以是Map。
,最后终结,不可能产生本末倒置的情况,比如把一个结束状态的线程转变为新建状态,则会出现异常,例如如下代码会抛出异常: 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
领取专属 10元无门槛券
手把手带您无忧上云