《Java核心技术卷1》Chap12并发汇总

JAVA核心技术(卷1、卷2)(原书第9版译) 带标签目录,Java领域最有影响力和价值的著作之一,拥有20多年教学与研究经验的资深Java技术专家撰写(获Jolt大奖),与《Java编程思想》齐名,10余年全球畅销不衰,广受好评。第9版根据JavaSE7全面更新,同时修正了第8版中的不足,系统全面讲解Java语言的核心概念、语法、重要特性和开发方法,包含大量案例,实践性强。 立即下载

《Java核心技术卷1》Chap12并发汇总

并发

  1. 多进程和多线程的区别:每个进程都拥有自己的一整套变量,而线程则共享数据;

  2. 线程的六种状态:

    • 新建(new Thread())
    • 可运行(线程可能正在运行,也可能没有运行)
    • 阻塞
    • 等待
    • 计时等待
    • 终止
  3. 阻塞:当一个线程试图获取一个内部的对象锁,而这个锁目前被其他线程占有,该线程就会被阻塞,当线程等待另一个线程通知调度器出现一个条件时,该线程就会进入等待状态;有几个方法有超时参数,调用这些方法会让线程进入计时等待状态;

  4. 终止线程:

    • run()方法正常退出,线程自然终止;
    • 因为一个没有捕获的异常终止了run()方法,线程意外终止;

  1. 除了已经废弃的stop()方法,没有办法可以强制线程终止
//java.lang.Thread
void join()  :  等待终止指定的线程
void interrupt()  :  向线程发送中断请求
static boolean interrupted() :  当前线程是否中断,会改变中断状态
boolean   isInterrupted() :  当前线程是否中断,不改变中断状态
void setDaemon(boolean isDaemon)  : 将线程转换为守护进程,唯一用途是为其他线程提供服务
void setPriority(int  newPriority) :  设置线程优先级,现在最好不用
    
    
while(!Thread.currentThread().isInterrupted() && ...)
{
    ...
}
  1. 可以调用interrupt()方法,设置线程中断状态(向进程发送中断请求),Thread.currentThread isInterrupted()方法获取是否设置中断状态,调用这个方法不会改变中断状态;
  2. 线程run()方法不能抛出任何检查型异常,在线程死亡前,异常会传递到一个用于处理未捕获异常的处理器;

同步

  1. 为了避免竞态条件破坏数据,必须学习如何同步存取: 使用锁对象;
  2. 有2种机制可以防止并发访问代码块:
    • ReentrantLock类:Java 5中提供,可重入锁
    • synchronized关键字
//ReentrantLock保护代码块结构:
mylock.lock();		//ReentrantLock : 可重复锁
try{
    ...
}finally{
    mylock.unlock();		//必须释放,防止死锁
}
  1. 使用锁时,不能使用try-with-resources语句;
  2. ReentrantLock: 重入锁,因为线程可以反复获得已拥有的锁,锁有一个持有计数器(hold count)来跟踪对lock()方法的嵌套调用,每次调用lock()方法后必须使用unlock()方法进行释放,被一个锁保护的代码可以调用另一个使用相同锁的方法;
// java.util.concurrent.locks.Lock
void lock() ; 	//获得这个锁,如果锁当前被另一个线程占有,则阻塞
void unlock();		//释放这个锁
// java.util.concurrent.locks.ReentrantLock
ReentrantLock() ;		//构造重入锁,用来保护临界区
ReentrantLock(boolean fair);		//	构造采用公平策略的锁,公平锁倾向于选择等待时间最长的线程,公平锁可能影响线程;

private class Bank{
    //声明私有重入锁
    private var bankLock = new ReentrantLock();
    public void transfer(int from , int to , int amount)
    {
        bankLock.lock();    //加锁
        try{
            ...
        }finally{
            bankLock.unlock();
        }
    }
}
  1. 条件对象 : 可以使用条件对象来管理哪些已经获得了一个锁却不能做有用工作的线程,Java的条件对象又称为条件变量(conditional variable):
    • 一个锁可以有一个或多个相关联的条件对象;
    • 当不满足某条件时,可以调用条件对象的await()方法,此时,将进入该条件的等待集,当锁可用时,该线程并不会变为可运行状态,实际上,它仍保持非活动状态,直到在另一个线程上调用signAll()方法;
    • 当一个线程调用await()方法时,它没有办法重新自行激活,必须通过其他线程来重新激活该线程,如果一直没有激活,则将导致死锁
    • signalAll():并不会立即激活线程,只是解除等待线程的阻塞,sign():随机选择一个等待集中的线程,并解除这个线程的阻塞状态,存在死锁危险
    • 只有线程拥有该锁时,才能调用其对应的await(), sign(), signAll()方法
class Bank{
    private Condition sufficientFunds;
    ...
        public Bank()
    {
        ...
        sufficientFunds  =  bandlock.newCondition();
    }
}
//await一般调用方法
while(!(OK to proceed))
{
    condition.await();
}
//java.util.concurrent.locks.Lock
//java.util.concurrent.locks.Lock
Condition  newCondition();		//返回一个与锁相关联的条件对象

//java.util.concurrent.locks.Condition
void await();		//将该线程放在这个条件的等待集中
void signalAll();	//解除该条件等待集中所有线程阻塞态
void signal();			//从该条件的等待集中随机选择一个线程,解除其阻塞态


synchronized

  1. 锁和条件的作用:

    1. 锁用来保护代码片段,一次只能有一个线程执行被保护的代码;
    2. 锁可以管理试图进入被保护代码的线程;
    3. 一个锁可以有一个或多个相关联的条件对象;
    4. 每个条件对象管理那些已经进入被保护代码段但还不能运行的线程
  2. Java中每个对象都有一个内部锁,如果一个方法声明为同步方法,那么对象的锁将保护整个方法,要调用这个对象,线程必须获得内部对象锁:

public synchronized void method()
{
}
//等价
public void method()
{
    this.intrinsicLock.lock();		//	获得内部锁
    try{
        ...
    }finally{
        this.intrinsicLock.unlock();
    }
}
  1. 内部对象锁只有一个条件对象,调用wait()方法将一个线程增加到等待集中,notifyAll()/notify()方法可以解除等待线程的阻塞;
  2. wait() , notifyAll() , notify()是Object的final 方法,Condition为避免重复:await()、signalAll()、signal();
  3. 每个对象都有一个内部锁,并且这个内部锁有一个内部条件
  4. 最好既不使用Lock\Condition,也不使用synchronized关键字,在许多情况下,可以使用java.util.concurrent包中的某些机制,处理所有锁定;
//java.lang.Object

void notifyAll();		//解除在这个对象上调用wait()方法的线程的阻塞状态,该方法只能在同步方法或同步块中调用
void notify();		//随机解除在这个对象上调用wait方法的线程的阻塞状态

void wait();		//导致一个线程进入等待状态,直到它得到通知
  1. 同步块,专用锁:
public Bank{
    	private var lock = new Object();
    	synchronized(lock)			//
        {
            ...
        }
}
  1. 监视器:

    • 监视器是只包含私有字段的类;
    • 监视器每个对象有一个关联的锁;
    • 所有方法由这个锁锁定;
    • 锁可以有任意多个相关联的条件;
  2. volatile: 保证变量在各个线程之间可见,volatile不能提供原子性

  3. final变量:线程安全

  4. 线程局部变量ThreadLocal:

//java.lang.ThreadLocal<T>
T get();
void set(T t);
void remove();
static <S> ThreadLocal<S>  withInitial(Supplier<? extends S> supplier);	//创建一个线程局部变量
    
//非线性安全
public static final  SimpleDateFormat  dateFormat = new SimpleDateFormat("yyyy-MM-dd");
//ThreadLocal
public static final ThreadLocal<SimpleDateFormat>  dateFormat = ThreadLocal.withInitial(()->new SimpleDateFormat("yyyy-MM-dd"));
  1. 生产者线程向队列插入元素,消费者线程则获取元素,使用队列,可以安全地从一个线程向另一个线程传递数据;

  2. 阻塞队列Blocking queue , put() , take()方法,协调多线程之间的合作;

    //java.util.concurrent.ArrayBlockingQueue
    //java.util.concurrent.LinkedBlockingQueue
    //java.util.concurrent.LinkedBlockingDeque
    
  3. java.util.concurrent:提供了ConcurrentHashMap , ConcurrentSkipListMap , ConcurrentSkipListSet , ConcurrentLinkedQueue:

    1. 这些集合具有弱一致性,这意味着迭代器不一定能反映出它们构造之后的所有更改;
  4. 构造一个新线程的开销很大,涉及到与操作系统的交互,如果程序中存在大量生命周期很短的线程,那么不应该将每个任务映射到一个单独的线程,而应该使用线程池(thread pool),线程池包含包含很多准备运行的线程,为线程池提供一个Runnable方法,就会有一个线程调用run方法,当run方法退出时,这个线程池不会死亡,而是留在池中为下一个请求提供服务;

  5. Runnable封装一个异步运行的任务,可以把他想象成没有参数和返回值的异步方法,Callable与Runnabl类似,但是其有返回值:

    public interface  Runnable{
        public void run();
    }
    public interface Callable<V>{
        V call() throws Exception;
    }
    
  6. Future<V>用来保存异步计算的结果,可以启动一个计算,然后将Future对象交给某个线程,Future<V>接口有:

    V  get();
    void cancel();		//取消计算
    boolean isCancelled();
    boolean isDone();
    
  7. 执行器:Executors,执行器有许多静态工厂方法,用来构造线程池:

    newCachedThreadPool();
    newFixedThreadPool();
    newWorkStealingPool();
    newSingleThreadExecutor();
    newSingleThreadScheduledExecutor();
    
  8. 使用如下方法将Runnable或Callable对象提交给ExecutorService:

    Future<T> submit(Callable<T> task);
    Future<?> submit(Runnable task);
    Future<T> submit(Runnable task, T result);
    
  9. 使用完一个线程池时,调用shutdown()方法,启动线程池关闭序列,被关闭的执行器不再接受新任务,所有任务完成时,线程死亡,调用shutdownnow() ,线程池会取消苏搜友尚未开始的任务;

  10. Thread pooling使用步骤:

    1. 调用Executors类的静态方法构造线程池;
    2. 调用submit提交Runnable或Callable对象
    3. 保存好返回的Future对象,以便得到结果或取消任务
    4. 当不需要再提交任何任务时,调用shutdown.
17、神经网络训练算法与高阶模糊Cohen - Grossberg神经网络稳定性分析 本文介绍了一种新的数据驱动算法用于神经网络训练,该算法继承三次样条权重函数的优点,具有简单架构和良好泛化性能,并通过并行机制显著提升训练速度。同时,研究了高阶模糊Cohen-Grossberg神经网络(HOFCGNN)在可变及无界延迟下的稳定性,利用M矩阵理论和向量Lyapunov函数方法,证明了系统平衡点的存在性、唯一性和全局指数稳定性。研究成果为神经网络的高效训练与稳定应用提供了理论支持和技术路径。 阅读详情

相关推荐

从流体力学到深度学习:手把手教你用PINN预测涡流场(基于TensorFlow2.10+GPU)

本文详细介绍了如何利用物理信息神经网络(PINN)结合TensorFlow 2.10和GPU加速,预测Navier-Stokes方程的涡流场。通过核心原理讲解、实战环境配置、网络架构设计及物理约束实现,帮助读者掌握从流体力学到深度学习的跨学科技术应用,特别适合处理复杂流体问题和非定常流动场景。

weixin_29048309的博客 211

java核心技术卷1---第12章 并发

什么是线程 单独的线程运行一个任务的过程: 将执行这个任务的代码放在一个类的run方法中 从这个Runnable构造一个Thread对象 启动线程 两个线程输出是交错的,说明他们是并发运行,实际上两个输出行交错时,输出可能会混乱 package com.fu.javatec.chapter09; import java.util.function.Consumer; public class Demo01 { } class ThreadTest{ public static final i

weixin_55845798的博客 569

FastAPI + Layui:打造企业级敏捷开发后台管理系统

本文详细介绍了如何使用FastAPI和Layui构建高效的企业级后台管理系统。FastAPI提供高性能的异步API支持,而Layui则简化了前端开发流程,两者结合可实现快速开发和部署。文章涵盖了从环境搭建、核心组件开发到性能优化的全流程,特别适合需要敏捷开发的企业项目。

weixin_29045585的博客 555

Java核心技术第十二章 并发

调用start方法,线程处于可运行状态,可能正在运行也可能没有运行。

vain556的博客 996

FortiClient EMS实战:从安装到配置的全流程优化指南

本文详细解析了FortiClient EMS 7.0版本的部署与优化全流程,帮助企业构建零信任终端安全体系。从环境规划、高效安装、终端纳管到高级运维,提供实战指南和优化技巧,特别适用于Windows Server环境,助力企业提升终端安全管理效率。

weixin_29325007的博客 547

避坑指南:Qt无边框窗口拖动+阴影效果这些细节要注意

本文深入探讨了Qt无边框窗口开发中实现流畅拖动与阴影效果的关键细节与常见陷阱。针对高DPI屏幕适配、阴影闪烁、拖动卡顿及多显示器兼容性等核心难题,提供了从QGraphicsDropShadowEffect原理剖析到手动绘制优化、坐标系统精准处理及平台原生事件拦截的实战解决方案,帮助开发者构建稳定、美观的商业级应用界面。

weixin_27943395的博客 477

Java基础-第12章:并发

Java基础-第12章:并发 什么是线程 线程状态 线程属性 同步 线程安全的集合 任务和线程池 异步计算 进程 什么是线程 线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。 首先来看一个使用了两个线程的简单的程序。这个程序可以在银行账户之间完成资金转账。我们使用一个Bank类,它可以存储给定数目的账户的余额。transfer方法将一定金额从一个账

weixin_41551034的博客 364

一个开源的AI数据分析工具,与数据对话,一键生成SQL、图表、表格、报告和智能商业分析。

Wren AI是一个开源的AI智能代理,让用户能够跟数据对话,实现从文本到SQL的转换,还能生成图表、电子表格、报告以及商业智能分析。它支持多种语言,能深入挖掘数据价值,提供智能数据探索功能,通过语义索引和精心设计的界面,让用户无需写代码即可获取洞察。Wren AI采用独特的架构,包含Wren UI、Wren AI Service和Wren Engine三大核心服务,可部署在本地或云端,助力团队高效、安全地解锁数据潜力。

AI_Charlotte的博客 4491

《Java核心技术》学习笔记——第12章 并发

版权声明:本文为博主ExcelMann的原创文章,未经博主允许不得转载。 第12章 并发 作者:ExcelMann,转载需注明。 第12章内容目录: 什么是线程 线程属性 线程安全的集合 异步计算 线程状态 同步 任务和线程池 进程 ...

a602389093的博客 703

[游戏排查] Baldur‘s Gate 3 加载完成即崩溃?五步排查帮你快速定位问题

《博德之门3》加载崩溃问题解决方案:针对游戏进度条走完后闪退的情况,提供五步排查法。首先清除LevelCache缓存(成功率最高),其次检查Mod兼容性,然后切换Vulkan/DX11渲染API,再排查存档损坏问题,最后可删除配置目录(需备份存档)。重点提示Steam验证无法解决此类问题,建议按步骤顺序排查,多数情况下前两步即可解决问题。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 3256

Python散点图(Scatter Plot):高阶分析、散点图矩阵、三维散点图及综合应用

散点图作为一种直观且功能强大的数据可视化工具,在数据分析中具有广泛的应用。通过观察散点图中数据点的分布模式,我们可以轻松地判断变量之间是否存在相关性,以及相关性的类型和强度。同时,散点图也是识别数据集中异常值的有效工具,无论是通过直观观察还是结合统计方法,都能帮助我们发现数据中的异常情况。掌握散点图的绘制和分析技巧,将使我们在数据探索和决策制定中更加得心应手。

SiArch的博客 1443

Java并发编程实战(学习笔记十一 第十二章 并发程序的测试)

并发程序的测试

ahaha413525642的博客 673

第4章--CANoe library开发 - 诊断功能

因为专栏要做的是汽车ECU自动化测试程序,测试的是ECU的诊断和刷新,因此就需要利用CANoe的接口,开发一些方便使用的诊断报文收发函数。

j187067046的博客 1396

《Java核心技术》第10版读书笔记之Chap5(1)——类的继承

本文是阅读《Java核心技术第10版》后的读书笔记,主要介绍Java中类继承的相关内容,包括extends关键字、super关键字及其与this的比较、函数重载与函数覆写的概念以及比较。

LPWSTR的博客 1852

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Java 核心技术 I chap 1 ~ 4 阅读摘要

1. 前言最近突然想学一下java, 于是就找到了 《Java 核心技术 I》这本书来研究, 并记录一些自己觉得相对重要的, 与C++中有些不太一样的东西。2. chap 1 概述2.1 Java 特点 java 可以看成是C++语法的一个纯净版本, 简单 面向对象 可以非常容易的处理网络 安全, 不用担心内存泄露 可移植性好, 在各个平台上运行结果保证一致 多线程特性 有applet 可以用于启用

zhyh1435589631的专栏 714

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java核心技术1-对象与类

摘要: 本文是《Java核心技术 10th》中对象与类的要点总结 【对算法,数学,计算机感兴趣的同学,欢迎关注我哈,阅读更多原创文章】 我的网站:潮汐朝夕的生活实验室 我的公众号:算法题刷刷 我的知乎:潮汐朝夕 我的github:FennelDumplings 我的leetcode:FennelDumplings 本文是《Java核心技术1》第10版 【Chap4 类和对象】 的要点总结。由于此前在 C++ 中已经接触过面向对象编程,这里主要关注 Java 与 C++ 有区别的地方。 面向对象程序设.

计算机、人工智能、算法和数学 495

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Java核心技术1-基本程序设计

《Java核心技术 10th》中基本程序设计的要点总结

计算机、人工智能、算法和数学 392

Java核心技术1-lambda表达式

Java lambda表达式

计算机、人工智能、算法和数学 580

Java多线程核心技术

《Java多线程核心技术》笔记。 Chap1. Java多线程技能 进程是受操作系统管理的基本运行单元线程是在进程中独立运行的子任务 使用多线程的方法 继承Thread类:继承自Runnable接口 继承Runnable接口:可以支持多继承 Thread.java类中的start()方法是异步执行,此线程对象交给“线程规划器”处理,而run()方法是同步执行,由main()主线程来...

liinux-Talk is cheap,show me the code. 231

《Java核心技术》第10版读书笔记之Chap5(3)——Object类及其equals、hashCode与toString方法

本文是阅读《Java核心技术第10版》第五章后的读书笔记,主要介绍Java中所有类共同的基类——Object类及其equals、hashCode与toString方法,特别是对我们自己实现的类中应该如何更好地覆写以上方法进行总结和归纳。

LPWSTR的博客 552

《Java核心技术》第10版读书笔记之Chap5(5)——Java中变参函数以及枚举类的原理与使用

本文是阅读《Java核心技术第10版》第五章后的读书笔记,主要介绍Java中变参函数的原理、定义与调用方法,以及Java中枚举类型的使用与原理。

LPWSTR的博客 548

《Java核心技术》第10版读书笔记之Chap5(2)——方法调用过程、final、类型转换、abstract与访问标识符

本文是阅读《Java核心技术第10版》第五章后的读书笔记,主要介绍Java中类继承的相关内容,包括成员方法的调用过程分析、final与abstract关键字的含义、类型转换(向上、向下转型与instanceof)以及访问控制标识符相关内容。

LPWSTR的博客 2848

Chap 07: 多线程

●     进程之间不共享数据,即使是同类进程之间(如两个记事本之间)●     线程则是实现单一功能的一个指令序列,一个程序中可以包含多个线程。●     线程的生命周期: 创建,可运行,运行,不可运行,死亡。●     java中的线程类: Thread和Runnable接口。●     Thread类: 是支持多线程机制的一个重要的类,提供了很多关于线程调度(启动,休眠,运行

(孙)小泉 1125

《Java核心技术》第10版读书笔记之Chap5(4)——基本数据类型的Wrapper类、自动拆箱与装箱及过程中的坑

本文是阅读《Java核心技术第10版》第五章后的读书笔记,主要介绍Java中所有基本数据类型byte、short、int、long、char、boolean、float、double这8种基本数据类型的封装类Byte、Short、Integer、Long、Character、Boolean、Float和Double的常见用法、Java编译器提供的自动装箱与拆箱语法糖以及这个过程中的坑和常见理解上的错误。

LPWSTR的博客 585

day33周一总结_chap-javase阶段测试_1.加载类概念不清2.线程理解不到位[选择题]

一.【单选题】 1. 下列说法正确的是 _____。 A. Java程序经编译后­­­会产生machine code B. Java程序经编译后会产生byte code C. Java程序经编译后会产生DLL D. 以上都不正确 答案【B】 解答:字节码文件 2.下列代码中,哪句代码会报错() byte b = 127; byte b = 10; b += 1; byte b = 11; b = b + 1; char c = 97; 答案【C】 解答: b是by...

xjadolphx的博客 283

Hands-On Network Programming with C完整教程:从Socket创建到数据传输

Hands-On Network Programming with C是一本专注于网络编程实践的技术书籍,其配套代码项目为开发者提供了从Socket创建到数据传输的完整示例。本教程将带领你逐步探索C语言网络编程的核心技术,掌握TCP/IP通信的实现方法,轻松构建自己的网络应用程序。 ## 为什么选择C语言进行网络编程? C语言作为系统级编程语言,在网络编程领域具有无可替代的优势。它能够直接操作

gitblog_00674的博客 702
上一篇: typora+picgo设置图床
下一篇: java 8 Hashmap深入解析 —— put get 方法源码(转载)
hellohake
博客等级 码龄10年 4543粉丝 108原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值