zoukankan      html  css  js  c++  java
  • java多线程

    java多线程基础
    • 进程: 进程是程序向操作系统申请资源的最小单位
    • 线程: 进程中可独立执行的最小单位, 一个进程可以包含多个线程, 同一个进程中所有线程共享进程中的资源
    • 启动一个线程: 请求java虚拟机运行相应的线程, 具体何时启动由线程调度器决定,所以调用start方法后由系统决定线程什么时候执行
    • 状态变量: 即类的实例变量, 静态变量
    • 共享变量: 可以被多个线程共同访问的变量
    • java两种方式实现原子性:
      1. 使用锁(Lock), 通常在软件方面实现
      2. 使用CAS, 通常在硬件方面实现
    • 线程安全的三个方面:
      1. 原子性: 该操作在其执行线程以外的线程看来是不可分割的
      2. 可见性: 多线程情况下,一个线程对某个变量进行更新后,后续访问该变量的线程无法立刻获取该更新结果, 一种是JIT编译器优化代码导致的, 一种是变量分配到寄存器而不是主存中,一个处理器无法读取另外一个处理器的寄存器,如果两个线程运行在不同的处理器中就会出现这种问题. volatile可以保证这种可见性,volatile可以阻止JIT编译器做导致程序不正常的优化,另外还可以让处理器执行冲刷处理器缓存的操作,从而保障可见性.
      3. 有序性: 主要是出现指令重排序, 存储系统重排序等
    线程活性故障
    1. 死锁: 线程X持有资源A的时候等待另外一个线程释放资源B,而另外一个线程Y在持有资源B的时候却等待X释放资源A
    2. 锁死: X线程唤醒要得到A锁, 如果A锁被Y线程持有,一旦Y线程死亡,则X线程永远唤醒不起.
    3. 活锁: 小猫试图咬自己的尾巴,却始终咬不到,外在表现就是执行的任务没有进展,进程却处在running状态
    4. 饥饿: 一窝小鸟中总是最健壮的先抢到食物,体现为优先级低的线程始终任务无法进展
    线程同步机制
    1. java线程同步机制: volatile关键字, final关键字, static关键字, Object.wait(), Object.notify()等
    2. 排它锁或互斥锁: 一个锁一次只能被一个线程持有
    3. Java虚拟机对锁实现方法划分: 内部锁(synchronize), 显式锁(java.concurrent.locks.Lock),
    4. 锁的获得隐含着刷新处理器的动作, 锁释放隐含着冲刷处理器缓存的动作
    • 可重入锁的实现
    • 锁的相关概念
      1. 可重入性: 一个线程持有一个锁的时候还能继续成功申请该锁
      2. 锁的争用和调度: 公平策略和非公平策略,对应的是公平锁和非公平锁, 内部锁属于非公平锁,显示锁支持两种
      3. 锁的粒度: 一个锁实例保护共享数据量的大小
    • 改进锁: 读写锁, 允许多个线程同时读取, 一次允许一个线程对共享变量进行更新
    public class ReadWriteLockUsage {
        private final ReadWriteLock rwLock = new ReentrantReadWriteLock();
        private final Lock readLock = rwLock.readLock();
        private final Lock writeLock = rwLock.writeLock();
    
        // 读线程执行该方法
        public void reader() {
            readLock.lock(); // 申请读锁
            try {
                // 在此区域读取共享变量
            } finally {
                readLock.unlock();// 总是在finally块中释放锁,以免锁泄漏
            }
        }
    
        // 写线程执行该方法
        public void writer() {
            writeLock.lock(); // 申请读锁
            try {
                // 在此区域访问(读、写)共享变量
            } finally {
                writeLock.unlock();// 总是在finally块中释放锁,以免锁泄漏
            }
        }
    }
    
  • 相关阅读:
    在windows上使用win2000资源工具
    Apache与Tomcat整合
    web服务器和应用服务器概念比较
    linux定时删除N天前的文件(文件夹)
    程序员如何自我学习和成长?
    20210708总结
    Docker 常用命令!还有谁不会?
    Redis常用命令set
    laravel与thinkphp之间的区别与优缺点
    2021年7月总结
  • 原文地址:https://www.cnblogs.com/Baronboy/p/13044632.html
Copyright © 2011-2022 走看看