Java 就是个多线程的世界

1. 类的线程安全

我们经常说类是线程安全的,类是线程不安全的。那么什么样的类才是线程安全的?

1.1 定义

多线程环境下,不管不同的线程如何使用和调度这个类,这个类总是表现出正确的行为。那么这个类就是线程安全的。类的线程安全有两个关键点:1.操作的原子性 2.内存的可见性。

如果在多个线程***享状态,当同步机制不正确时,就会出现线程不安全的情况。


简单的程序应该不会有线程安全问题吧?

Q:什么情况下会有线程安全问题

A:当某个实现多线程的线程类中有实例变量时

ps:有状态,无状态对象是什么概念

有状态就是有数据存储功能。有状态对象(Stateful Bean),就是有实例变量的对象?,可以保存数据,是非线程安全的。在不同方法调用间不保留任何状态。

无状态就是一次操作,不能保存数据。无状态对象(Stateless Bean),就是没有实例变量的对象?.不能保存数据,是不变类,是线程安全的。


为什么有线程安全问题?必须要先了解计算机原理

当多个线程同时共享,同一个全局变量或静态变量,做写的操作时,可能会发生数据冲突问题,也就是线程安全问题。但是做读操作是不会发生数据冲突问题。


举个例子

从内存读取 1M 数据 250 微妙 = 250000 纳秒 CPU 读取一次内存 100 纳秒



问:从内存中读取 1M 的 int 型数据由 CPU 进行累加,耗时要多久?

答:1M 的数据,Java 里 int 型为 32 位,4 个字节共有 1024*1024/4 = 262144 个整数 CPU 计算耗时:262144 *0.6 = 157 286 纳秒

262144 个整数从内存读取到 CPU,需要耗时内存读取耗时:262144*100+250000 = 26 464 400 纳秒

怎么解决线程安全问题?

线程安全问题,归根到底一句话:在多线程之间修改共享数据引起的

并发编程——从入门到成仙

为了让大家更好的理解学习线程并发,在这里给大家推荐一个由华为资深架构师 Mark 老师讲授的《并发编程——从入门到入仙》专题课程!从 Java 线程入门,到原子操作 CAS 与显式锁,再到并发安全,三天快速掌握并发编程核心知识,成为并发大神!


你以为这样就完了?更多并发相关资料,一并奉上!


最后

关于面试刷题也是有方法可言的,建议最好是按照专题来进行,然后由基础到高级,由浅入深来,效果会更好。当然,这些内容我也全部整理在一份 pdf 文档内,分成了以下几大专题:

  • Java 基础部分

  • 算法与编程


  • 数据库部分


  • 流行的框架与新技术(Spring+SpringCloud+SpringCloudAlibaba)


这份面试文档当然不止这些内容,实际上像 JVM、设计模式、ZK、MQ、数据结构等其他部分的面试内容均有涉及,因为文章篇幅,就不全部在这里阐述了。

作为一名程序员,阶段性的学习是必不可少的,而且需要保持一定的持续性,这次在这个阶段内,我对一些重点的知识点进行了系统的复习,一方面巩固了自己的基础,另一方面也提升了自己的知识广度和深度。

最后提醒一下哦,如果你想要学习,却无奈于没有干货学习资料,只需你多多支持一下即可

开源分享:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】