`

记录一些并发的事情

 
阅读更多

定义:线程是"进程"中某个单一顺序的控制流。
一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。
线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,保存有进程中的虚拟地址空间,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。线程的运行中需要使用计算机的内存资源和CPU。

线程的状态:
新生线程(New Thread):产生一个Thread对象就生成一个新线程。当线程处于"新线程"状态时,仅仅是一个空线程对象,它还没有分配到运行线程所必须的资源。因此只能启动或终止
它。任何其他操作都会引发异常。

可运行态(Runnable):start()方法产生运行线程所必需的的资源,调度线程运行,并且调用线程的run()方法。在这时线程处于可运行态。该状态不称为运行态是因为这时的线程并不总
是一直占用处理机。(在相同优先级下,调度顺序根据CPU时间段的分配确定)

非运行态(Not Runnable):线程被挂起或者等待等。当以下事件发生时,线程进入非运行态。
①suspend()方法被调用;
②sleep()方法被调用;
③线程使用wait()来等待条件变量;
④线程处于I/O等待。

死亡态(Dead):线程被销毁。
当run()方法返回,或别的线程调用stop()方法,线程进入死亡态。

多线程中的Volatile和synchronized
在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的"可见性"。
synchronized可以保证共享数据的访问互斥和可见性,volatile可以保证共享数据的可见性。(volatile针对原子操作来说)


Volatile的官方定义:java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,在某
些情况下比锁更加方便。如果一个字段被声明成volatile,java线程内存模型确保所有线程看到这个变量的值是一致的。(Volatile不能保证访问共享变量的互斥,但是可以保证共享变量的可见性)Java语言规范保证读或者写一个变量是原子的(Atomic),除非这个变量是long或者double,这就是说,读取一个非long或double类型的变量,可以保证返回的值是某个线程保存在该变量中的,即使多个线程在没有同步的情况下并发的修改这个变量也是如此(但这些修改不能保证可见性)。

Volatile变量修饰符如果使用恰当的话,它比synchronized的使用和执行成本会更低,因为它不会引起线程上下文的切换和调度。
上下文(Context)简单说来就是一个环境,具体来说就是各个变量、数据和资源信息:寄存器变量、进程打开的文件、内存信息等
上下文(Context)的切换和调度我理解的就是挂起A线程并等待B线程运行结束

处理器为了提高处理速度,不直接和内存进行通讯,而是先将系统内存的数据读到内部缓存(L1,L2或其他)后再进行操作,但操作完之后不知道何时会写到内存,如果对声明了Volatile变量进行写操作,JVM就会向处理器发送一条Lock前缀的指令,将这个变量所在缓存行的数据写回到系统内存。而在在多处理器下,为了保证各个处理器的缓存是一致的,就会实现缓存一致性协议,每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期了,当处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器的缓存行设置成无效状态,当处理器要对这个数据进行操作的时候,会强制重新从系统内存里把数据读到处理器缓存里。


Java SE1.6中的Synchronized

在JavaSE1.6里锁一共有四种状态,无锁状态,偏向锁状态,轻量级锁状态和重量级锁状态,它会随着竞争情况逐渐升级。锁可以升级但不能降级,意味着偏向锁升级成轻量级锁后
不能降级成偏向锁。
Java中的每一个对象都可以作为锁。

对于同步方法,锁是当前实例对象。
对于静态同步方法,锁是当前对象的Class对象。
对于同步方法块,锁是Synchonized括号里配置的对象。

偏向锁:
优点 加锁和解锁不需要额外的消耗,和执行非同步方法比仅存在纳秒级的差距。
确定 如果线程间存在锁竞争,会带来额外的锁撤销的消耗。
适用 适用于只有一个线程访问同步块场景。

轻量级锁
优点 竞争的线程不会阻塞,提高了程序的响应速度。
确定 如果始终得不到锁竞争的线程使用自旋会消耗CPU。
适用 追求响应时间。 同步块执行速度非常快。

重量级锁
优点 线程竞争不使用自旋,不会消耗CPU。
确定 线程阻塞,响应时间缓慢。
适用 追求吞吐量。同步块执行速度较长。


合理的配置线程池
要想合理的配置线程池,就必须首先分析任务特性,可以从以下几个角度来进行分析:

任务的性质:CPU密集型任务,IO密集型任务和混合型任务。
任务的优先级:高,中和低。
任务的执行时间:长,中和短。
任务的依赖性:是否依赖其他系统资源,如数据库连接。

分享到:
评论

相关推荐

    gratitude-journal:每天记录您一直感激的事情的应用程序

    "gratitude-journal"是一款应用程序,旨在帮助用户每天记录他们感到感激的事情,以此培养感恩的心态。这个应用的构建采用了一套现代的Web技术栈,包括Ionic框架、Angular前端开发库和Node.js后端服务器。接下来,...

    Keylogger:将数据发送到API的Python简单隐藏式键盘记录器

    Python简单的键盘记录程序,用于跟踪用户输入并发送到服务器。 稍后,作为数据分析系列的一部分,我将在此处上传另一个应用程序,以分析原始文本输入并检索有关被跟踪用户的性格和习惯的有价值的信息。 让我们等待...

    阿里巴巴java开发手册中文版

    2. 方法设计:方法应尽可能短小,每个方法只做一件事情。避免过长的方法和过深的嵌套结构。 3. 数据结构的选择:合理使用集合类,如List、Set、Map等,根据实际需求选择合适的数据结构,以提高性能。 四、并发编程...

    阿里巴巴JAVA开发者手册v1.3.0

    这份规约涵盖了命名规范、代码结构、异常处理、并发控制、日志记录等多个核心领域,旨在推动Java开发的最佳实践。 一、命名规范 1. 类名:采用驼峰式命名,每个单词首字母大写,如`UserName`. 2. 接口名:同类名,...

    13复试事情1

    7. **索引(Index)**:索引是数据库中加速查询的重要工具,通过创建指向数据的指针,使得查找特定记录的速度大大提高。正确使用索引能显著提升查询性能,但也会占用额外的存储空间。 8. **3NF(Third Normal Form...

    数据库主键的五种设计方法

    但是,这种方法存在一些缺点,如在手动要插入指定 ID 的记录时会显得麻烦,尤其是在系统与其他系统集成时,需要数据导入时,很难保证原系统的 ID 不发生主键冲突。 第三种:Max 加一 这种方法是由于自动编号存在...

    SQL专家回答

    然而,如果存储过程产生了多个结果集,那么事情就会变得稍微复杂一些。在这种情况下,你可以使用一个表变量或一个永久表来存储结果,但你需要确保正确处理了多个结果集。一个方法是在调用存储过程时使用OUTPUT参数来...

    阿里巴巴Java编程规范_阿里巴巴Java编程规范_

    - 单一职责原则:一个类只做一件事情,一个方法只做一件事情。 - 依赖倒置原则:依赖于抽象,不依赖于具体实现。 6. **并发编程** - 使用并发工具类,如`java.util.concurrent`包下的工具,而非手动管理线程。 ...

    阿里java开发规范

    这份规范不仅涵盖了基础的编程风格,还包括了面向对象设计原则、异常处理、并发控制、日志记录、性能优化等多个方面。下面将对这些重要的知识点进行详细的阐述。 1. **命名规范**: - 类名使用全大写字母,采用...

    tracing:轻量级的库,用于手动分布式系统跟踪

    跟踪提供了您的分配代码在做什么(好,它说在做什么)的精确,有序的表示形式,可用于评估从单元测试或代码检查尚不清楚的一些事情。 这些措施包括正确的并发管理,以及正确遵循要实现的协议要求的任何排序/因果规则...

    阿里巴巴java开发手册(终极版)2017

    以下是基于该手册的一些主要知识点的详细解读: 1. **基本编码规范**: - 命名规则:类名使用驼峰命名法,包名全小写,接口名建议以`I`开头,常量全大写且下划线分隔,变量名首字母小写。 - 注释:使用Javadoc...

    GameServer:最近略无聊,需要带感的事情

    在这个场景中,提到的"GameServer:最近略无聊,需要带感的事情"可能意味着开发团队正在寻求新的挑战或优化方案,以提升游戏体验。 标签"Go"表明这个GameServer可能是用Go语言编写的。Go语言,也被称为Golang,是由...

    Java编程规范(阿里巴巴 Java 开发手册)

    此外,手册还涵盖了一些其它重要的规约,如错误和异常处理,日志记录,以及安全性相关的注意事项,如输入验证、权限控制等。 总的来说,《阿里巴巴 Java 开发手册》旨在通过一套共同的规范,促进团队间的高效协作,...

    阿里巴巴Java开发手册终极版1.3.0.7z

    以下是根据1.3.0版本手册内容提炼的一些关键知识点: 1. **基础编码规范**: - 变量命名:遵循驼峰命名法,如`camelCase`,避免使用拼音和数字开头。 - 注释:注释应简洁明了,描述代码的功能和逻辑,避免过度...

    Java多线程--让主线程等待所有子线程执行完毕

    // 做一些事情 System.out.println(Thread.currentThread().getName() + " 开始"); try { Thread.sleep(1000); // 模拟耗时操作 } catch (InterruptedException e) { e.printStackTrace(); } System.out....

    hookdeploysinker:在收到 github webhook(如提交)后做一些事情(如部署)

    4. **错误处理和日志记录**:对于处理过程中可能出现的异常,需要有良好的错误处理机制,并将日志记录下来,以便后续排查问题。 5. **可扩展性**:设计"hookdeploysinker"时,应考虑其扩展性,允许添加新的事件处理...

    阿里巴巴规范 eclispe阿里插件 idea阿里插件 阿里java规范pdf

    手册涵盖了许多方面,如命名规范、代码结构、异常处理、并发控制、日志记录等,旨在引导开发者遵循良好的编程习惯。 1. **命名规范**:这是最基础也是最重要的规范之一。手册要求变量、方法、类名等遵循一定的命名...

    Java 等待唤醒机制 代码优化

    本文将深入探讨这个主题,并提供一些代码优化的建议,适合Java初学者进行学习和参考。 等待唤醒机制是Java并发编程中的一个关键工具,主要用于解决线程间的同步问题。Java提供了两种主要的等待唤醒机制:`wait()`、...

    服务端开发那些事

    服务器的可维护性关注于如何设计服务器以便于未来的升级和故障修复,需要考虑日志记录、监控告警、备份恢复和故障迁移等因素。 服务端开发是一个不断变化和进步的领域,开发人员需要不断地学习新技术、新框架和新...

Global site tag (gtag.js) - Google Analytics