Java并发编程-阶段性总结:活跃性问题

2021-06-14
阅读 2 分钟
2.3k
并发编程有 3 道关卡,分别是:安全性问题、活跃性问题、性能问题,如果三关全过,也就掌握并发编程这门高阶技能。今天,我们就来过第二关:解决活跃性问题。活跃性问题所谓活跃性问题,是指程序没法执行下去。比如说,公司有一个转账的业务,你已经实现了线程安全,解决了安全性问题,并发再高也不出错。那这样是不是完...

Java并发编程-阶段性总结:安全性问题

2021-05-30
阅读 3 分钟
2.5k
通过前面的 7 篇文章,你可能觉得并发编程很复杂,既要考虑程序结果是不是正确,又要考虑程序能不能执行,还要考虑服务器能不能扛住,实在不知道从哪入手~

Java并发编程-饥饿:没有一点经验,还真的搞不定

2021-04-18
阅读 6 分钟
1.4k
我们如果想要转账,那么就得先锁定 Account.class。当锁定成功后,就修改两个账户的余额。最后,我们再调用银行的接口,让钱真正到达银行账户,这笔转账才算完成。

Java并发编程-活锁:它是那种很少见,又没啥危险的Bug

2021-02-22
阅读 3 分钟
4.8k
在前面的两篇文章中,我们一直在关注程序的死锁问题,包括:造成死锁的原因、规避死锁的办法。然而,除了死锁的问题外,还有另外两种情况。它们虽然没那么常见,可一旦发生,程序照样无法执行下去。这一次,我们先看看其中一种情况—活锁。线程的相互谦让—活锁通过前面两篇文章,相信你已经知道了:发生死锁后,线程会相...

Java并发编程-死锁(下):如何解决死锁

2021-02-17
阅读 4 分钟
1.9k
我在上篇文章曾经提到,锁的本质是串行化,如果覆盖的范围太大,会导致程序的性能低下。为了提升性能,我们用了细粒度锁,但这又带来了死锁问题。如何解决死锁问题,就是程序员价值所在。如何规避死锁说实话,大部分情况下,你不需要考虑死锁问题。因为只有在并发量很大的时候,死锁才会出现。那该怎么解决呢?很简单,...

Java并发编程-死锁(上):追求性能的代价

2021-02-13
阅读 3 分钟
1.8k
前面几篇文章,我们一直在关注如何解决并发问题,也就是程序的原子性、可见性、有序性。这些问题一旦出现,程序的结果就没法保证。好在 Java 是一门强大的语言,锁-synchronized 是一味万能药。你只要用好锁,几乎能解决所有并发问题。不过,并发编程有一个特点:解决完一个问题,总会冒出另一个新问题。锁带来的性能问...

Java并发编程-用锁的正确姿势:为什么加了锁,但余额还是出错?

2021-01-29
阅读 5 分钟
3.6k
在 Java 中,锁好像是颗万能药,没什么问题是加锁解决不了的。的确,锁能解决绝大部分的并发问题。然而,最简单的东西也往往最容易出现问题。你只要稍有不慎,不但 Bug 没有解决,还得花费大量的时间做各种排查。既然如此,我们就来好好看看:为什么用了锁,程序还是出错了。什么才是正确的锁模型一说到锁,你的大脑中可...

Java并发编程-解决并发:多线程应用没那么难写

2021-01-18
阅读 5 分钟
2k
我们前面提到过,为了提高计算机的性能,大神们只能破坏程序的可见性、原子性、有序性,从而带来了并发问题。这三者是编程领域的共同问题,所有编程语言都会遇到。Java 作为排名第一的编程语言,自然也有一套领先的技术方案—Java 内存模型。我们要写出可靠的程序,自然要对 Java 内存模型有所了解。破除一个错误的观念说...

Java并发编程-并发根源:为什么转账后,余额总是对不上?

2021-01-05
阅读 6 分钟
2.3k
你开发了一套转账系统,转账的流程没问题,通过了内部测试,上线后看起来也没问题。然而,过了一段时间,用户居然可以无视余额,直接提现。眼看就要失业了,问题究竟出在哪里呢?经过一番检查,你发现每次出事的时候,用户都同时发起了好几笔订单,导致了并发问题。什么是并发问题并发,就是在很短的时间内,有很多个请...

Java高级特性-泛型:泛型实战,封装统一的服务端响应类

2021-01-04
阅读 4 分钟
3.9k
在平时工作中,我们写代码可能都在堆增删改查,很少有机会加上 Java 的高级特性。比如,泛型,你一定在 Mybatis、Hibernate 这些持久化框架中用过。可轮到自己开发的时候,却发现这个东西简直鸡肋,完全用不上。

Java高级特性-泛型:泛型的基本用法,怎样才能少写 1 万行代码

2020-12-26
阅读 8 分钟
8.9k
泛型是 Java 的一个高级特性。在 Mybatis、Hibernate 这种持久化框架,泛型更是无处不在。然而,泛型毕竟是高级特性,藏在框架的底层代码里面。我们平时都是写业务代码,可能从来没见过泛型,更别提怎么用了。既然如此,我们就一步步学习泛型吧。泛型是什么泛型是一种特殊的类型。你不用一开始就指明参数的具体类型,而...

Java高级特性-反射:使用反射,把对象转换成 MongoDb 的结构

2020-12-15
阅读 6 分钟
4.3k
反射是 Java 的一个高级技巧,大量地用在各种开源项目上。比如,Spring、Tomcat、Jetty 等等项目中,都大量地用到了反射。作为 Java 程序员,我们如果用好反射,不但能提高自己的技术水平,还能开发出更好的项目。然而,虽然很多人听说过反射,但却不知道应该用在哪里。那么,我们就从实际工作出发,使用反射,把对象转...

Java高级特性-反射:不写死在代码,还怎么 new 对象?

2020-12-07
阅读 7 分钟
2k
在开源框架中,往往以同一套算法,来应对不同的数据结构。比如,Spring 的依赖注入,我们不用自己 new 对象了,这工作交给 Spring 去做。

Java高级特性-注解:注解实现Excel导出功能

2020-11-30
阅读 5 分钟
8.6k
注解是 Java 的一个高级特性,Spring 更是以注解为基础,发展出一套“注解驱动编程”。这听起来高大上,但毕竟是框架的事,我们也能用好注解吗?的确,我们很少有机会自己写注解,导致我们搞不清楚注解是怎么回事,更别提用好注解了。既然这样,我们就从具体的工作出发,开发一个 Excel 导出功能。我相信,你在搞懂这个例...

Java高级特性-注解:Spring的注解是怎么回事?

2020-11-29
阅读 3 分钟
1.1k
在 Spring 中,大家会经常用到各种注解。在加上这些注解后,我们的代码就有了很多神奇的功能。比如,下面这个类只用了两个注解:@Controller和@RequestMapping,你就能在浏览器上访问 index() 方法。 {代码...} 就这么简单的功能,你如果用 Java 自带的 Servlet,要写的代码最少也会翻倍。这就是注解的威力。什么是注解...