Java 学习笔记

Java 学习笔记

Concurrent 包

使用 CAS,避免内核调用。CAS 是Compare And Swap 的缩写。
CAS 命令是现代 CPU 都支持的一种指令。
这个指令对一个数据的写操作,需要三个操作数:

  1. 内存里的值的地址
  2. 旧的值
  3. 新的值

只有当内存里的值 == 旧的值 时,内存里的值才会被设置成为新的值。
而且这个操作是原子操作,不会被 CPU 执行调度打断。

如何实现锁的功能和自旋

实现锁:
将地址,0和1传过去,如果地址内的值是0,则将值更新为1,这样就锁成功了
别人去访问时会以为地址内的值还是0,CAS 比较后就会失败,
只有我知道他是1,再次去可以解锁。
自旋:
while(true) 等待之前加锁的线程将锁释放,一直尝试去获取锁

concurrent 包中的 Atomic 类族

每种基本数据类型对应的 Atomic 类,以及引用类型的 Atomic 类

  • AtomicBoolean
  • AtomicInteger
  • AtomicIntegerArray
  • AtomicLong
  • AtomicLongArray
  • AtomicReference

concurrent 包中的锁

如何对应java jdk 中的 synchronized

  • 使用 ReentrantLock。注意要在 finally中 unlock

wait-notify 机制

  • Condition 对象 await(), signal(), signalAll()

CountDownLatch: 具备 join() 的作用

  1. new 对象时传入需要等待的线程个数作为计数器初始值。
  2. 每个线程内调用 countDown() 减少计数器个数
  3. await() 判断 计数器个数,来决定是否等待结束

比join 的好处是,join 必须确保线程已经 start,
而await() 只需要new出对象后就可以成功调用

Concurrent 包中的数据结构

LinkedBlockingQueue:

  • peek():获取当前队首元素,但不出队
  • offer():将元素入队,返回是否成功入队。一般在限制队列大小的时候才会失败。该方法有超时版本。(在超时时间内等待操作完成,到时间再返回)
  • poll():出队一个元素,队列为空就返回空,也有超时版本。
  • put():将元素加入队列,如果队列满了就等着。
  • take():一定要拿一个元素出来,没拿到就等着。
  • put和take可以用来实现生产者消费者模型

currenthashMap:

  • key 和 value都不允许为 null
  • putIfAbsent 是在没有这个key的时候才会放入这对 key-value
  • compute 更新key value 通过一个lambda表达式
  • computeIfPresent:存在key时才会执行compute
  • computeIfAbsent:不存在key时才会执行compute

concurrent 包中的线程池

线程池:线程的创建和销毁很耗资源,所以引入线程池,
创建若干个线程,用一个工作队列存储任务,线程池内的线程循环的从
工作队列中拿任务去执行,直到线程池shutdown,线程才结束。

聊天室开发任务

功能:

  • 可以进入聊天室,指定用户名,检查用户名重名
  • 服务器端消息转发
  • 可以任意两人聊天
  • 聊天内容仅限文本
  • 可以进行查看在线用户列表等服务端功能

习题(扩展功能):

  • 群发消息
  • 发送文件
  • 心跳检测,自动去除断开连接的客户端

Java 的 ORM 框架

  1. MyBatis
  2. Hibernate
  3. TopLink

什么是学习一门语言

语法和基础

  • 数据类型
  • 表达式,语句,代码块
  • 面向对象:封装,继承,多态
  • 线程和异常处理
  • 标准类库

类库

  • jar 包:类库是以jar包的形式发布的。jar 包是java组织多个class文件的方式,其本质是一个zip压缩包,后缀名是jar
  • 类库:是以jar包发布的,可以完成某个功能的一个或多个jar包

工具

  • maven:构建和打包。丰富的插件可以组成复杂的构建过程
  • git:源代码版本控制
  • IDE
  • jenkins:自动化持续集成

底层和进阶

底层-内存相关

  • 内存堆(heap)和线程栈
  • JMM
  • GC(garbage collection):GC log 分析和 GC 调优

底层-JVM和Java规范相关

  • JVM 和 Java 字节码
  • Class 文件格式
  • Class Loader

进阶

  • 多线程和线程安全
  • 程序可读性
  • 优化

超越代码:能力

不限于某种编程语言

  • 本能+直觉:对问题的难度、复杂性和需要的时间有一个直觉的反应。能够快速且准确的判断问题的难点和可能出现问题的地方。
  • 分解+架构:拿到一个问题的时候,可以将问题分解为某种编程语言/技术可以解决的子模块/功能
  • 解决问题:任何工作中的问题。从需求分析到架构设计,从接口设计到代码实现,从文档到测试,从脑洞大开到靠谱创新,从内存使用到CPU占用,从bug可以重现到bug难以重现,从集成到联调,从数据到环境,从数据库到消息队列,从在线到离线,从开发到部署,从测试环境的问题到开发环境的问题,从单台机器的问题到集群分布式的问题,从上线到维护,从技术支持到hotfix,从性能到监控,从技术栈更新到系统完全重构。
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2022 qusong
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信