目录

什么是Callable和Future?

线程进入某个对象的synchronized的实例方法后,其它线程是否可进入此对象的其它方法?

乐观锁 与 悲观锁

CopyOnWriteArrayList可以用于什么应用场景?

什么叫线程安全?servlet是线程安全吗?

怎么检测一个线程是否拥有锁?


什么是Callable和Future?

1、Callable 接口类似于 Runnable,但是 Runnable 不会返回结果,并且无法抛出返回结果的异常,而 Callable 功能更强大一些,被线程执行后,可以返回值,这个返回值可以被 Future 拿到,也就是说 Future 可以拿到异步执行任务的返回值。

2、Future 接口表示异步任务,是还没有完成的任务给出的未来结果。所以说 Callable 用于产生结果,Future 用于获取结果。

3、Runable 出自 JDK1.0,Callable 出自 JDK 1.5,可以参考《submit 提交Callable任务》

线程进入某个对象的synchronized的实例方法后,其它线程是否可进入此对象的其它方法?

1、如果其他方法没有 synchronized 修饰的话,其他线程是可以进入的。

2、所以要开放一个线程安全的对象时,得保证每个方法都是线程安全的。

3、可以参考《 synchronized 添加对象锁与类锁》

乐观锁 与 悲观锁

悲观锁

1、总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。

2、传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。再比如Java里面的同步原语synchronized关键字的实现也是悲观锁。

乐观锁

1、每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。

2、乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库提供的类似于write_condition机制,其实都是提供的乐观锁。在Java中java.util.concurrent.atomic包下面的原子变量类就是使用了乐观锁的一种实现方式CAS实现的。

CopyOnWriteArrayList可以用于什么应用场景?

1、CopyOnWriteArrayList 的好处之一是当多个迭代器同时遍历和修改这个列表时,不会抛出ConcurrentModificationException。在CopyOnWriteArrayList中,写入将导致创建整个底层数组的副本,而源数组将保留在原地,使得复制的数组在被修改时,读取操作可以安全地执行。

2、由于写操作的时候,需要拷贝数组,会消耗内存,如果原数组的内容比较多的情况下,可能导致 young gc 或者 full gc;

3、不能用于实时读的场景,像拷贝数组、新增元素都需要时间,所以调用一个set操作后,读取到数据可能还是旧的,虽然CopyOnWriteArrayList 能做到最终一致性,但是还是没法满足实时性要求;

4、CopyOnWriteArrayList透露的思想

读写分离,读和写分开

最终一致性

使用另外开辟空间的思路,来解决并发冲突

什么叫线程安全?servlet是线程安全吗?

1、线程安全是编程中的术语,指某个函数、函数库在多线程环境中被调用时,能够正确地处理多个线程之间的共享变量,使程序功能正确完成。

2、Servlet不是线程安全的,servlet是单实例多线程的,当多个线程同时访问同一个方法,是不能保证共享变量的线程安全性的。

3、Struts2的action是多实例多线程的,是线程安全的,每个请求过来都会new一个新的action分配给这个请求,请求完成后销毁。

4、SpringMVC的Controller和Servlet采用类似的处理流程,所以同样线程不安全。

5、Struts2好处是不用考虑线程安全问题;Servlet和SpringMVC需要考虑线程安全问题,但是性能可以提升不用处理太多的gc,可以使用ThreadLocal来处理多线程的问题。

怎么检测一个线程是否拥有锁?

1、java.lang.Thread 中有一个方法叫 holdsLock(Object obj),它返回true则表示当前线程拥有某个具体对象的锁。

public static native boolean holdsLock(Object obj);

Java 面试—乐/悲观锁,wait/notify/notifyAll对比相关推荐

  1. **Java有哪些悲观锁的实现_阿里秋招Java研发工程师岗:来自校友的面试还原(已拿Offer)...

    前言 本篇题材来自我的校友投稿,他在最近的秋招校招中拿到了蚂蚁金服的实习生Offer,整体思路和面试题目由面试本人--小林提供(译名) 由于作者面试过程中高度紧张,本文中只列出了自己还记得的部分题目. ...

  2. JAVA线程间协作:wait.notify.notifyAll

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  3. Java简单演示悲观锁

    每博一文案 看过这样一句话,时间在不断的筛选你身边的人和事.当你什么都不在乎的时候,你的人生才刚刚开始. 当我们什么都不在乎时,会发现什么都可能会进行经历,但什么都一定会过去,起始都会离开的或早或晚吧 ...

  4. **Java有哪些悲观锁的实现_面试4连问:乐观锁与悲观锁的概念、实现方式、场景、优缺点?...

    推荐阅读: 数据库面试4连问:分库分表,中间件,优缺点,如何拆分? 终极手撕之架构大全:分布式+框架+微服务+性能优化,够不够? 消息队列面试,你能顶得住面试官这波10大连环炮的攻势吗? 01 乐观锁 ...

  5. **Java有哪些悲观锁的实现_淘宝Java研发面试:Redis+Mybatis+高并发+线程池

    在面试的这件事上,我做了大量的"功课",首先我研究了几乎所有大厂的面试题,还和负责招聘工作的几个朋友,详细的探讨了 Java 面试所要涉及的知识点 并发 简单描述下悲观锁乐观锁 J ...

  6. Java 面试 :乐观锁 悲观锁

    乐观锁悲观锁,是为了解决多线程并发操作共享变量可能导致的脏读.幻读和不可重复读等问题 悲观锁 悲观锁,是因为这是一种对数据的修改持有悲观态度的并发控制方式.总是假设最坏的情况,每次读取数据的时候都默认 ...

  7. 七 内置锁 wait notify notifyall; 显示锁 ReentrantLock

    Object中对内置锁进行操作的一些方法: Java内置锁通过synchronized关键字使用,使用其修饰方法或者代码块,就能保证方法或者代码块以同步方式执行. 内置锁使用起来非常方便,不需要显式的 ...

  8. **Java有哪些悲观锁的实现_「Java并发编程」何谓悲观锁与乐观锁,Java编程你会吗...

    何谓悲观锁与乐观锁 悲观锁 乐观锁 两种锁的使用场景 乐观锁常见的两种实现方式 1. 版本号机制 2. CAS算法 乐观锁的缺点 1 ABA 问题 2 循环时间长开销大 3 只能保证一个共享变量的原子 ...

  9. Java 多线程 4:wait() 和 notify()/notifyAll()

    轮询快速到底 线程本身是操作系统中独立的个体,但是线程与线程之间不是独立的个体,因为它们彼此之间要相互通信和协作. 想像一个场景,A 线程做 int 型变量 i 的累加操作,B 线程等待 i 到了 1 ...

  10. java里面的悲观锁和乐观锁

    最近面试,面试官提到了悲观锁和乐观锁,感觉回答的不是很好,特此总结记录. 简单来说,悲观锁就是凡事都认为会出现最坏的情形,而乐观锁就是认为凡事都以最好的情形发展,对应一个消极,一个积极. 悲观锁 具有 ...

最新文章

  1. java文件处理之压缩,分割
  2. String.slice
  3. 研究发现:一心多用会使认知水平下降
  4. 深度学习笔记(5) 深层神经网络
  5. 欢迎使用 QEMU 的文档!| 目录
  6. Linux内核开发:创建proc文件并与用户空间接口
  7. 【MYSQL快速入门】常用函数:文本函数
  8. 51单片机的矩阵键盘、跑马灯和呼吸灯设计
  9. 学习效率不高,换个思路试试
  10. 800*480bmp图片显示
  11. 【转载】非常实用的chrome插件 IT人必备
  12. 通过qmh启动qt应用
  13. Codeforces Round #469 (Div. 2) F. Curfew (贪心)
  14. IObit Uninstaller Pro v10.6.0.4 Cracked 安装监视器无法开启或无效的解决方案
  15. vscode的自定义Snippets模板快捷键
  16. React Native 移动开发入门与实战
  17. 955.WLB 不加班公司名单!再新增 5 家公司!
  18. 为什么我选择并且推崇用ROS开发机器人
  19. Learning Cocos2d-x for XNA(6)——场景切换和场景过渡效果
  20. 头号电脑黑客凯文·米特尼克

热门文章

  1. DORADO实现动态拼装查询条件
  2. 本科生、硕士生、博士生
  3. 计算理论笔记 10月10日
  4. python中循环结构break_Python编程10:跳出循环结构之break和continue
  5. 拓端tecdat|使用R语言随机波动模型SV处理时间序列中的随机波动率
  6. (12)数据结构-二叉树基本操作
  7. 计算机绘图设备cmy,《计算机图形学》练习测试题库
  8. 清华大学操作系统OS学习(二)——OS基本概念
  9. pytorch自动求导数机制
  10. 【深度学习】论文导读:GoogLeNet模型,Inception结构网络简化(Going deeper with convolutions)