12 2019 档案
摘要:spring mvc 是 spring web mvc,spring 框架的一部分,一个 mvc 设计模型的表现层框架。 具体参考:4.2.9.RELEASE 版 spring mvc 官方文章 https://docs.spring.io/spring/docs/4.2.9.RELEASE/spr
阅读全文
摘要:编程式事务管理,在代码中调用 commit()、rollback()等事务管理相关的方法 maven pom.xml文件 编程式事务管理,可以通过 java.sql.Connection 控制事务。spring 配置文件 测试代码 删除用户语句回滚,打印出两个用户 基于 TransactionPro
阅读全文
摘要:spring 配置文件中 <bean> 节点的 autowire 参数可以控制 bean 自动装配的方式 default - 默认的方式和 "no" 方式一样 no - 不自动装配,需要使用 <ref />节点或参数 byName - 根据名称进行装配 byType - 根据类型进行装配 const
阅读全文
摘要:singleton:单例模式,在整个Spring IoC容器中,使用 singleton 定义的 bean 只有一个实例 prototype:原型模式,每次通过容器的getbean方法获取 prototype 定义的 bean 时,都产生一个新的 bean 实例 只有在 Web 应用中使用Sprin
阅读全文
摘要:Spring 不保证 bean 的线程安全。 默认 spring 容器中的 bean 是单例的。当单例中存在竞态条件,即有线程安全问题。如下面的例子 计数类 spring 配置文件 测试类 打印结果开头和结尾 修改 spring 配置文件,把 bean 的作用域改为 prototype 测试结果输出
阅读全文
摘要:JDK Atomic开头的类,是通过 CAS 原理解决并发情况下原子性问题 CAS 包含 3 个参数,CAS(V, E, N)。V 表示需要更新的变量,E 表示变量当前期望值,N 表示更新为的值。只有当变量 V 的值等于 E 时,变量 V 的值才会被更新为 N。如果变量 V 的值不等于 E ,说明变
阅读全文
摘要:JDK 1.5 之前同步容器包括: Vector、Hashtable、Stack Collections 工具类将普通容器,转变为同步容器,如: 同步容器的实现原理就是在容器的操作方法上,加上了 synchronized 关键字。 List:CopyOnWriteArrayList Set:Copy
阅读全文
摘要:Spring框架的七大模块 1. Spring Core 框架的最基础部分,提供 IoC 容器,对 bean 进行管理。 2.Spring Context 基于 bean,提供上下文信息,扩展出JNDI、EJB、电子邮件、国际化、校验和调度等功能。 3.Spring DAO 提供了JDBC的抽象层,
阅读全文
摘要:1、xml中配置 bean 的申明、注册 <bean> 节点注册 bean <bean> 节点的 factory-bean 参数指工厂 bean,factory-method 参数指定工厂方法 bean 的注入 <property> 节点使用 set 方式注入 <constructor-arg> 节
阅读全文
摘要:IoC,Inversion of Control(控制反转)。 是一种设计思想,在Java开发中,将你设计好的对象交给容器控制,而不是显示地用代码进行对象的创建。 把创建和查找依赖对象的控制权交给 IoC 容器,由 IoC 容器进行注入、组合对象。这样对象与对象之间是松耦合、便于测试、功能可复用(减
阅读全文
摘要:AOP:Aspect Oriented Programming,面向切面编程。 通过预编译和运行期动态代理实现程序功能的统一维护。 在Spring框架中,AOP就是一个很重要的功能。 AOP 利用一种称为横切的技术,剖开对象的封装,并将影响多个类的公共行为封装到一个可重用模块,组成一个切面,即 As
阅读全文
摘要:基础与语法 JDK和JRE有什么区别? ==和equals的区别是什么? 基本类型和包装类对象使用 == 和 equals进行比较的结果? 什么是装箱?什么是拆箱?装箱和拆箱的执行过程?常见问题? hashCode()相同,equals()也一定为true吗? final在java中的作用 fina
阅读全文
摘要:spring 是一个开源的轻量级 JavaBean 容器框架。使用 JavaBean 代替 EJB ,并提供了丰富的企业应用功能,降低应用开发的复杂性。 轻量:非入侵性的、所依赖的东西少、资源占用少、部署简单,不同功能选择不同的 jar 组合 容器:工厂模式实现对 JavaBean 进行管理,通过控
阅读全文
摘要:UML是统一建模语言,Unified Modeling Language的缩写 综合了面向对象的建模语言、方法和过程,是一个支持模型化和软件系统开发的图形化语言,为软件开发的所有阶段提供模型化和可视化支持 可以帮助沟通与交流、辅助应用设计、文档的生成、阐释系统的结构和行为 定义了多种图形化的符号来描
阅读全文
摘要:多继承会产生钻石问题(菱形继承) 类 B 和类 C 继承自类 A,且都重写了类 A 中的同一个方法 类 D 同时继承了类 B 和类 C 对于类 B、C 重写的类 A 中的方法,类 D 会继承哪一个?这里就会产生歧义 考虑到这种二义性问题,Java 不支持多重继承 Java 支持类实现多接口 接口中的
阅读全文
摘要:简单工厂模式 是由一个工厂对象创建产品实例,简单工厂模式的工厂类一般是使用静态方法,通过不同的参数的创建不同的对象实例 可以生产结构中的任意产品,不能增加新的产品 抽象工厂模式 提供一个创建一系列相关或相互依赖对象的接口,而无需制定他们具体的类,生产多个系列产品 生产不同产品族的全部产品,不能新增产
阅读全文
摘要:创建型 工厂模式与抽象工厂模式 (Factory Pattern)(Abstract Factory Pattern) 单例模式 (Singleton Pattern) 建造者模式 (Builder Pattern) 原型模式 (Prototype Pattern) 结构型 适配器模式 (Adapt
阅读全文
摘要:2xx:表示请求已被成功接收、理解、接受 200(成功) 服务器已成功处理了请求。这个状态码对servlet是缺省的,如果没有调用setStatus方法的话,就会得到 200 204(无内容) 服务器成功处理了请求,未返回任何内容 205(重置内容) 服务器成功处理了请求,未返回任何内容,重置文档视
阅读全文
摘要:web工程中的web.xml文件: 注解: 原文链接 Java 自学经历 Java 面试题 H5 Java 面试题小程序
阅读全文
摘要:get() 返回的是一个 html 对象 eq() 返回的是一个 jQuery 对象 原文链接 Java 自学经历 Java 面试题 H5 Java 面试题小程序
阅读全文
摘要:区别:doPost 用来处理 post 请求,doGet 用来处理 get 请求 参数:传递的参数相同的都是 HttpServletRequest 和 HttpServletResponse 原文链接 Java 自学经历 Java 面试题 H5 Java 面试题小程序
阅读全文
摘要:CyclicBarrier 的中文意思是 "循环栅栏",简单理解就是一个可以循环利用的屏障。 用于让多个线程阻塞在屏障处,当屏障达到放开的条件,所有被阻塞的线程会继续执行,此时 CyclicBarrier 会自动重置。 阻塞线程在屏障处,调用 CyclicBarrier 对象的 await() 方法
阅读全文
摘要:赋值:null 表示定义了但未赋值,undefined 表示未定义 数据转换:null 在做数值转换时会被转换为 0,undefined 会被转换为 NaN 原文链接 Java 自学经历 Java 面试题 H5 Java 面试题小程序
阅读全文
摘要:Div居中:margin:auto 0px; 内容居中:text-align:center; 原文链接 Java 自学经历 Java 面试题 H5 Java 面试题小程序
阅读全文
摘要:基本选择器 层次选择器 基本过滤选择器 内容过滤选择器 可见性过滤选择器 属性过滤选择器 子元素过滤选择器 表单选择器 表单过滤选择器 原文链接 Java 自学经历 Java 面试题 H5 Java 面试题小程序
阅读全文
摘要:一、字面量的形式 二、使用 RegExp 对象 test()方法:测试正则是否匹配字符串 search()方法:在字符串搜索符合正则的内容,搜索到就返回出现的位置,搜索失败就返回 -1 match()方法: replace()方法: exec()方法:捕获组,仅 RegExp 对象可用 原文链接 J
阅读全文
摘要:身份证:/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/ 数字:/[0-9]/ 英文:/^[a-z]+$/i 中文:/[\u4e00-\u9fa5]/gm 数字逗号:/^[\d,]*$/ 手机号:/^[1][3,4,5,7,8][0-9]{9}$/ 新能源车牌(长
阅读全文
摘要:onload 表示页面包含图片等文件在内的所有元素都加载完成 ready 表示文档结构已经加载完成,不包含图片等非文字媒体文件 原文链接 Java 自学经历 Java 面试题 H5 Java 面试题小程序
阅读全文
摘要:HTML:Hyper Text Markup Language,超文本标记语言,是用来描述网页的一种语言 CSS:Cascading Style Sheets,层叠样式表,控制如何显示 HTML 元素 JavaScript,一种脚本语言,脚本代码无需编译,在浏览器或 JS 容器可以直接解释执行 页面
阅读全文
摘要:JSONP 是 JSON with Padding 的略称。 它是一个非官方的协议,允许在服务器端集成Script tags返回至客户端,通过 javascript callback 的形式实现跨域访问。 产生的背景: 浏览器限制 ajax 跨域请求 json 格式数据被浏览器原生支持 <scrip
阅读全文
摘要:CountDownLatch 可以起到发令枪的作用,JDK 1.5 开始提供 用 CountDownLatch 实现并发访问,在写测试工具时希望达到某条件后,所有线程同时执行 也可以用 CountDownLatch 实现,某线程等待其他线程完成,进行最后的统一处理 代码如下: 原文链接 Java 自
阅读全文
摘要:跨域:当浏览器执行脚本时会检查是否同源,只有同源的脚本才会执行,如果不同源即为跨域。 这里的同源指访问的协议、域名、端口都相同。 同源策略是由 Netscape 提出的著名安全策略,是浏览器最核心、基本的安全功能,它限制了一个源中加载脚本与来自其他源中资源的交互方式。 Ajax 发起的跨域 HTTP
阅读全文
摘要:1、从主流浏览器的实现角度看 下面的对比表格摘自: w3school -- HTTP 方法:GET 对比 POST 2、从 RFC 规范的(Safe-安全、Idempotent-幂等、Cacheable-可缓存性、语义)角度看 GET 安全;POST 不安全 GET 幂等;POST 不幂等 GET
阅读全文
摘要:浏览器 url 地址显示不同 服务端通过 forward 返回,浏览器 url 地址不会发生变化;服务器通过 redirect 返回,浏览器会重新请求, url 地址会发生变化 前后台两者页面跳转的处理方式不同 forward 跳转页面,是服务端进行页面跳转加载(include)新页面,直接返回到浏
阅读全文
摘要:从 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status 查到 301 和 302 状态码及含义。 301 Moved Permanently 被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI
阅读全文
摘要:一般默认情况下,在会话中,服务器存储 session 的 sessionid 是通过 cookie 存到浏览器里。 如果浏览器禁用了 cookie,浏览器请求服务器无法携带 sessionid,服务器无法识别请求中的用户身份,session失效。 但是可以通过其他方法在禁用 cookie 的情况下,
阅读全文
摘要:StampedLock 是从 JDK1.8 开始提供,它的性能比 ReadWriteLock 好 StampedLock 支持:乐观读锁、悲观读锁、写锁 StampedLock 的悲观读锁、写锁,与 ReadWriteLock 的读锁、写锁用法相似:读读可并行、读写互斥、写写互斥。 StampedL
阅读全文
摘要:ReadWriteLock 是 JDK 中的读写锁接口 ReentrantReadWriteLock 是 ReadWriteLock 的一种实现 读写锁非常适合读多写少的场景。读写锁与互斥锁的一个重要区别是读写锁允许多个线程同时读共享变量,这是读写锁在读多写少的情况下性能较高的原因。 读写锁的原则:
阅读全文
摘要:1、什么是 session session 是浏览器和服务器会话过程中,服务器分配的一块储存空间。服务器默认为浏览器在cookie中设置 sessionid,浏览器在向服务器请求过程中传输 cookie 包含 sessionid ,服务器根据 sessionid 获取出会话中存储的信息。 由于 ht
阅读全文
摘要:浏览器和应用服务交互,一般都是通过 Http 协议交互的。Http 协议是无状态的,浏览器和服务器交互完数据,连接就会关闭,每一次的数据交互都要重新建立连接。即服务器是无法辨别每次是和哪个浏览器进行数据交互的。 为了确定会话中的身份,就可以通过创建 session 或 cookie 进行标识。 两者
阅读全文
摘要:page(当前页面作用域):相当于 Java 关键字中 this。在这个作用域中存放的属性值,只能在当前页面中取出。 request(请求作用域):范围是从请求创建到请求消亡这段时间,一个请求可以涉及的多个页面。<jsp:forward>和<jsp:include>跳转到其他页面,也在作用域范围。
阅读全文
摘要:request:对应 Java 类 javax.servlet.http.HttpServletRequest;客户端的请求信息:Http协议头信息、Cookie、请求参数等 respons:对应 Java 类 javax.servlet.http.HttpServletRespons;用于服务端响
阅读全文
摘要:Servlet 一种服务器端的Java应用程序 由 Web 容器加载和管理 用于生成动态 Web 内容 负责处理客户端请求 Jsp 是 Servlet 的扩展,本质上还是 Servlet 每个 Jsp 页面就是一个 Servlet 实例 Jsp 页面会被 Web 容器编译成 Servlet,Serv
阅读全文
摘要:赋值:null 表示定义了但未赋值,undefined 表示未定义 数据转换:null 在做数值转换时会被转换为 0,undefined 会被转换为 NaN 原文链接 Java 自学指南 Java 面试题汇总PC端浏览【点这里】 Java知识图谱 Java 面试题汇总小程序浏览,扫二维码
阅读全文
摘要:信号量的实现模型一般包括:1个计数器、1个等待队列、3个方法(需要保证原子性) Semaphore 实现的伪代码(JDK 中 Semaphore 是基于 AbstractQueuedSynchronizer 实现,可以指定是否公平): 使用信号量实现互斥锁效果: 除了能实现互斥锁,信号量还可以做到允
阅读全文
摘要:对象的 wait(long timeout)、wait(long timeout, int nanos)、wait() 方法,组合对象的 notify()、notifyAll() 显示锁:Lock.newCondition()、Condition await 系列方法、Condition signa
阅读全文
摘要:每个 Java 对象都有一个内置锁 线程运行到非静态的 synchronized 同步方法上时,自动获得实例对象的锁 持有对象锁的线程才能运行 synchronized 同步方法或代码块时 一个对象只有一个锁 一个线程获得该锁,其他线程就无法获得锁,直到第一个线程释放锁。任何其他线程都不能进入该对象
阅读全文
摘要:启动一个线程需要调用 Thread 对象的 start() 方法 调用线程的 start() 方法后,线程处于可运行状态,此时它可以由 JVM 调度并执行,这并不意味着线程就会立即运行 run() 方法是线程运行时由 JVM 回调的方法,无需手动写代码调用 直接调用线程的 run() 方法,相当于在
阅读全文
摘要:加锁对象的 wait() 方法,使一个线程处于等待状态,并且释放所持有的对象的锁 加锁对象的 notify() 方法,由 JVM 唤醒一个处于等待状态的线程,具体哪个线程不确定,且与优先级无关 加锁对象的 notityAll() 方法,唤醒所有处入等待状态的线程,让它们重新竞争对象的锁 线程的 sl
阅读全文
摘要:sleep() 方法给其他线程运行机会时不考虑线程的优先级;yield() 方法只会给相同优先级或更高优先级的线程运行的机会 线程执行 sleep() 方法后进入阻塞状态;线程执行 yield() 方法转入就绪状态,可能马上又得得到执行 sleep() 方法声明抛出 InterruptedExcep
阅读全文
摘要:同步:发送一个请求,等待返回,然后再发送下一个请求 异步:发送一个请求,不等待返回,随时可以再发送下一个请求 使用场景 如果数据存在线程间的共享,或竞态条件,需要同步。如多个线程同时对同一个变量进行读和写的操作 当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回
阅读全文
摘要:可以 wait()、notify() 实现;也可以使用发令枪 CountDownLatch 实现。 CountDownLatch 实现较简单,如下: 原文链接 Java 自学指南 Java 面试题汇总PC端浏览【点这里】 Java知识图谱 Java 面试题汇总小程序浏览,扫二维码
阅读全文
摘要:单纯使用 volatile 关键字是不能保证线程安全的 volatile 只提供了一种弱的同步机制,用来确保将变量的更新操作通知到其他线程 volatile 语义是禁用 CPU 缓存,直接从主内存读、写变量。表现为:更新 volatile 变量时,JMM 会把线程对应的本地内存中的共享变量值刷新到主
阅读全文
摘要:wait() 方法是线程间通信的方法之一 必须在 synchronized 方法或 synchronized 修饰的代码块中使用,否则会抛出 IllegalMonitorStateException 只能在加锁的对象调用 wait() 方法 加锁的对象调用 wait() 方法后,线程进入等待状态,直
阅读全文
摘要:悲观锁(Pessimistic Lock):线程每次在处理共享数据时都会上锁,其他线程想处理数据就会阻塞直到获得锁。 乐观锁(Optimistic Lock):线程每次在处理共享数据时都不会上锁,在更新时会通过数据的版本号等机制判断其他线程有没有更新数据。乐观锁适合读多写少的应用场景 两种锁各有优缺
阅读全文
摘要:Condition 接口是 JDK 1.5 开始提供的,用来实现线程间的等待与唤醒 Condition 的对象可以通过 Lock 对象的 newCondition() 方法创建 Condition 对象方法的调用必须在 Lock 对象的 lock() 和 unlock() 之间,否则会抛出异常 ja
阅读全文
摘要:AtomicLong 是基于 CAS 方式自旋更新的;LongAdder 是把 value 分成若干cell,并发量低的时候,直接 CAS 更新值,成功即结束。并发量高的情况,CAS更新某个cell值和需要时对cell数据扩容,成功结束;更新失败自旋 CAS 更新 cell值。取值的时候,调用 su
阅读全文
摘要:ForkJoinPool 是 JDK1.7 开始提供的线程池。为了解决 CPU 负载不均衡的问题。如某个较大的任务,被一个线程去执行,而其他线程处于空闲状态。 ForkJoinTask 表示一个任务,ForkJoinTask 的子类中有 RecursiveAction 和 RecursiveTask
阅读全文
摘要:JDK Atomic开头的类,是通过 CAS 原理解决并发情况下原子性问题。 CAS 包含 3 个参数,CAS(V, E, N)。V 表示需要更新的变量,E 表示变量当前期望值,N 表示更新为的值。只有当变量 V 的值等于 E 时,变量 V 的值才会被更新为 N。如果变量 V 的值不等于 E ,说明
阅读全文
摘要:ReadWriteLock,读写锁。 ReentrantReadWriteLock 是 ReadWriteLock 的一种实现。 特点: 包含一个 ReadLock 和 一个 WriteLock 对象 读锁与读锁不互斥;读锁与写锁,写锁与写锁互斥 适合对共享资源有读和写操作,写操作很少,读操作频繁的
阅读全文
摘要:synchronized 竞争锁时会一直等待;ReentrantLock 可以尝试获取锁,并得到获取结果 synchronized 获取锁无法设置超时;ReentrantLock 可以设置获取锁的超时时间 synchronized 无法实现公平锁;ReentrantLock 可以满足公平锁,即先等待
阅读全文
摘要:实现层面不一样。synchronized 是 Java 关键字,JVM层面 实现加锁和释放锁;Lock 是一个接口,在代码层面实现加锁和释放锁 是否自动释放锁。synchronized 在线程代码执行完或出现异常时自动释放锁;Lock 不会自动释放锁,需要再 finally {} 代码块显式地中释放
阅读全文
摘要:作用: synchronized 表示只有一个线程可以获取作用对象的锁,执行代码,阻塞其他线程。 volatile 表示变量在 CPU 的寄存器中是不确定的,必须从主存中读取。保证多线程环境下变量的可见性;禁止指令重排序。 区别: synchronized 可以作用于变量、方法、对象;volatil
阅读全文
摘要:ThreadLocal 是线程本地存储,在每个线程中都创建了一个 ThreadLocalMap 对象,每个线程可以访问自己内部 ThreadLocalMap 对象内的 value。通过这种方式,避免资源在多线程间共享。 经典的使用场景是为每个线程分配一个 JDBC 连接 Connection。这样就
阅读全文
摘要:execute() 参数 Runnable ;submit() 参数 (Runnable) 或 (Runnable 和 结果 T) 或 (Callable) execute() 没有返回值;而 submit() 有返回值 submit() 的返回值 Future 调用get方法时,可以捕获处理异常
阅读全文
摘要:先解释两个概念。 等待池:假设一个线程A调用了某个对象的wait()方法,线程A就会释放该对象的锁后,进入到了该对象的等待池,等待池中的线程不会去竞争该对象的锁。 锁池:只有获取了对象的锁,线程才能执行对象的 synchronized 代码,对象的锁每次只有一个线程可以获得,其他线程只能在锁池中等待
阅读全文
摘要:主要区别 Runnable 接口 run 方法无返回值;Callable 接口 call 方法有返回值,支持泛型 Runnable 接口 run 方法只能抛出运行时异常,且无法捕获处理;Callable 接口 call 方法允许抛出异常,可以获取异常信息 测试代码 打印结果 原文链接 Java 自学
阅读全文
摘要:sleep() 是 Thread 类的静态本地方法;wait() 是Object类的成员本地方法 sleep() 方法可以在任何地方使用;wait() 方法则只能在同步方法或同步代码块中使用,否则抛出异常Exception in thread "Thread-0" java.lang.Illegal
阅读全文
摘要:在了解什么是 Java 内存模型之前,先了解一下为什么要提出 Java 内存模型。 之前提到过并发编程有三大问题 CPU 缓存,在多核 CPU 的情况下,带来了可见性问题 操作系统对当前执行线程的切换,带来了原子性问题 译器指令重排优化,带来了有序性问题 为了解决并发编程的三大问题,提出了 JSR-
阅读全文
摘要:Java 中 happens-before 原则,是在 JSR-133 中提出的。 原文摘要: • Each action in a thread happens-before every subsequent action in that thread. • An unlock on a moni
阅读全文
摘要:协程(Coroutine):是单线程下的并发,又称微线程,纤程。简单理解就是线程中的线程。 优点: 轻量,创建成本小,降低了内存消耗 用户态调度,减少了 CPU 上下文切换的开销,提高了 CPU 缓存命中率 减少同步加锁,提高了性能 可以用同步思维写异步代码 轻量,创建成本小,降低了内存消耗 用户态
阅读全文
摘要:除了使用 synchronized、Lock 加锁之外,Java 中还有很多不需要加锁就可以解决并发问题的工具类 1、原子工具类 JDK 1.8 中,java.util.concurrent.atomic 包下类都是原子类,原子类都是基于 sun.misc.Unsafe 实现的。 CPU 为了解决并
阅读全文
摘要:活锁 任务没有被阻塞,由于某些条件没有满足,导致一直重复尝试—失败—尝试—失败的过程。 处于活锁的实体是在不断的改变状态,活锁有可能自行解开。 死锁是大家都拿不到资源都占用着对方的资源,而活锁是拿到资源却又相互释放不执行。 解决活锁的一个简单办法就是在下一次尝试获取资源之前,随机休眠一小段时间。 看
阅读全文
摘要:并发程序一旦死锁,往往我们只能重启应用。解决死锁问题最好的办法就是避免死锁。 死锁发生的条件 互斥,共享资源只能被一个线程占用 占有且等待,线程 t1 已经取得共享资源 s1,尝试获取共享资源 s2 的时候,不释放共享资源 s1 不可抢占,其他线程不能强行抢占线程 t1 占有的资源 s1 循环等待,
阅读全文
摘要:线程死锁是指由于两个或者多个线程互相持有所需要的资源,导致这些线程一直处于等待其他线程释放资源的状态,无法前往执行,如果线程都不主动释放所占有的资源,将产生死锁。 当线程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。 产生原因: 持有系统不可剥夺资源,去竞争其他已被占用的系统不可剥夺资源
阅读全文
摘要:锁的级别从低到高: 无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁 锁分级别原因: 没有优化以前,sychronized是重量级锁(悲观锁),使用 wait 和 notify、notifyAll 来切换线程状态非常消耗系统资源;线程的挂起和唤醒间隔很短暂,这样很浪费资源,影响性能。所以 JVM
阅读全文
摘要:synchronized 和 java.util.concurrent.lock.Lock 之间的区别 实现层面不一样。synchronized 是 Java 关键字,JVM层面 实现加锁和释放锁;Lock 是一个接口,在代码层面实现加锁和释放锁 是否自动释放锁。synchronized 在线程代码
阅读全文