Java并发概述之安全

Wesley13
• 阅读 497

Java并发的学习内容主要来自《Java并发编程实战》一书,本文为一概述。

并发最简单的解释应该是不同任务的执行时间区间存在交集。由于时间上的交集+共享变量,并发会带来安全问题。

从任务的角度而言,任务的执行需要得到正确的效果;从对象的角度而言,对象需要被正确的访问。

所谓正确,或常说的线程安全,包括了一个对象操作,或者一个任务执行的三个方面:前置条件、不变约束、后置条件。这三个约束都与状态相关,只不过是状态在不同抽象层次上的参与。

状态(共享变量)在并发中有两个方面的语义:

1.作为对象的一部分,服从对象的约束

2.作为任务的一部分,服从任务的约束

这两个语义彼此独立,按需上锁

全书内容可以总结为:

第一部分:状态在线程中保证安全、状态在对象中保证安全、对象组合(集合作为一种特例)引入更多约束

第二部分:将任务跟线程解耦,线程本质上是OS调度的单位,解耦后引入了任务的生存周期问题,取消跟错误(超时、)的处理

第四部分:锁作为阻塞的原因,可能导致后果,Lock提供了定时、可中断、非块结构三种功能。

      条件队列作为前置条件的实现:

第一章  线程安全(不小心把第一章介绍省略了嘿嘿)

书的第一章是从线程角度讲述并发安全,如果每个线程都是安全的,则并发是安全的。

单个线程的安全可以通过原子性来保证,而原子性是由锁来实现的。锁是为了确保线程互斥执行,同一个锁管理的的各个线程本质上被安排成串行了。

一个锁管理一组线程串行执行。

锁的范围由前置条件、不变约束、后置条件这三个约束所涉及到的状态的作用域范围决定,显然就成了一组共享变量作用域范围的并。

到此,从  线程——正确性约束——状态变量  这一思路分析开始有些失控了,从而开始第二章,从对象的角度,封装状态与其操作,降低思维负担。

第二章  共享对象

不行,先把各章写完再写,只看目录太少了

点赞
收藏
评论区
推荐文章
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java锁学习(一)
作用能够保证同一时刻,最多只有一个线程执行该段代码,以达到并发安全的效果主要用于同时刻对线程间对任务进行锁地位synchronized是JAVA的原生关键字,是JAVA中最基本的互斥手段,是并发编程中的元老角色不使用并发的后果不使用并发会导致多线程情况下,同一个数据被多个线程同时更改,造成结果和预期不一致
Wesley13 Wesley13
3年前
java并发中CountDownLatch的使用
java并发中CountDownLatch的使用在java并发中,控制共享变量的访问非常重要,有时候我们也想控制并发线程的执行顺序,比如:等待所有线程都执行完毕之后再执行另外的线程,或者等所有线程都准备好了才开始所有线程的执行等。这个时候我们就可以使用到CountDownLatch。简单点讲,CountDownLatch存有一个放在QueuedS
Wesley13 Wesley13
3年前
java并发程序和共享对象实用策略
java并发程序和共享对象实用策略在并发程序中使用和共享对象时,可以使用一些实用的策略,包括:1.线程封闭2.只读共享。共享的只读对象可以由多个线程并发访问,但任何线程都不能修改它。共享的只读对象包括不可变对象和事实不可变对象3.线程安全共享。线程安全地对象在器内部实现同步。4.保护对象。被保护的对象只能通过持有特定的锁
【开发宝典】Java并发系列教程(四)
本文将给大家分享Java并发编程相关的知识点,具体将对Java常见的并发编程方式和手段进行总结,以便可以从使用角度更好地感知Java并发编程带来的效果。
Wesley13 Wesley13
3年前
Java多线程之任务执行
Java多线程之任务执行一、在线程中执行任务1.串行的执行任务在应用程序中可以通过多种策略来调度任务,而其中的策略能够更好的利用潜在的并发性。_最简单的策略就是在单个线程中串行的执行各项任务。_public class SingleThreadWebServer {
Stella981 Stella981
3年前
Python并发(二)
并发是指一次处理多件事,而并行是指一次做多件事。二者不同,但互相有联系。打个比方:像Python的多线程,就是并发,因为Python的解释器GIL是线程不安全的,一次只允许执行一个线程的Python字节码,我们在使用多线程时,看上去像很多个任务同时进行,但实际上但一个线程在执行的时候,其他线程是处于休眠状态的。而在多CPU的服务器上,Java或Go的多线程,
Wesley13 Wesley13
3年前
Java中的线程池
java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中,合理使用线程池能够带来三个好处。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺
Wesley13 Wesley13
3年前
Java线程与多线程
1线程与多线程1.1线程是什么?线程(Thread)是一个对象(Object)。用来干什么?Java线程(也称JVM线程)是Java进程内允许多个同时进行的任务。该进程内并发的任务成为线程(Thread),一个进程里至少一个线程。Java程序采用多线程方式来支持大量的并发请求处理,程序如果在
京东云开发者 京东云开发者
11个月前
ThreadPoolExecutor线程池内部处理浅析 | 京东物流技术团队
我们知道如果程序中并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束时,会因为频繁创建线程而大大降低系统的效率,因此出现了线程池的使用方式,它可以提前创建好线程来执行任务。本文主要通过java的ThreadPoolExecutor来查看线程池