并发编程学习小结

JordanInShenzhen JordanInShenzhen     2022-11-04     397

关键词:

       前段时间由于项目需要,自己设计了个线程池的框架,结合工厂模式,能够支持业务根据各自业务量的需要,定制自己线程池的大小。虽然通过这个对并发编程已经有了一定的了解,但是个人认为自己目前对于java的并发编程只是局限于使用和浅层的了解阶段,在这里先对自己这段时间的学习做个总结。

       首先,一般java多线程的实现,有两种方式,继承Thread类,或者实现runnable接口,但是基本上都是使用的实现runnable接口的方式,这样能够避免遇到java的单继承的局限。我们可以使用Thread对象的start()方法启动一个线程,同时,在线程跑的过程中,我们还可以使用Thread对象的sleep()方法使一个线程进入休眠状态,A线程还可以使用Thread对象的interrupt()方法中断B线程(中断是使B线程继续往下走,如休眠状态会被唤醒抛出中断异常)。

       对于线程阻塞,有四种情况会导致线程阻塞问题,使用了sleep方法、使用了wait方法、使用了read方法(会阻塞到字节流读完为止)、阻塞在获取某个有排他性的资源。

        volatile是一种弱同步机制,修饰的变量在多线程的时候,JVM每次都会从主存中读取该变量的值,并且当该变量的值变化时,都会强迫将该值写回到主存当中,所以使用了这个变量后,效率会降低。而synchronize修饰的同步机制叫互斥锁机制,它所获得的锁叫互斥锁。每个对象都有一个锁标记,当线程拥有这个锁标记时才能访问这个资源。对于synchronize和volatile关键字,当且仅当满足如下两个条件时,volatile变量才能保证其安全性:

1. 对变量的写入操作不依赖变量的当前值

2. 该变量没有包含在其他变量的不变式中

在需要同步的时候,一般第一选择synchronize关键字,这是最安全的方式,使用其他任何方式都是有风险的。

       对于死锁,我们一定要遵循以下规则:

1. 只在最短的时间内持有锁,考虑使用同步语句块代替整个方法同步

2. 尽量不要写同一时刻需要持有多个锁的代码

3. 创建和使用一个大锁代替若干个小锁

       使用wait/notify方法需要注意早期遗漏问题,需要配合全局变量做判断,如果notify方法并没有唤醒另外一个线程(早期遗漏等原因),则通过这个boolean类型的全局变量做while循环,直到成功通知为止。

(16、17)

       

《java并发编程的艺术》学习小结

java并发编程的艺术第一章并发编程的挑战上下文切换:cpu通过时间片让不同线程轮流运行,从线程状态保存到下一次线程运行这个过程就是一次上下文切换多线程并不一定比单线程快,因为多线程会有线程创建和上... 查看详情

《java并发编程的艺术》学习小结

java并发编程的艺术第一章并发编程的挑战上下文切换:cpu通过时间片让不同线程轮流运行,从线程状态保存到下一次线程运行这个过程就是一次上下文切换多线程并不一定比单线程快,因为多线程会有线程创建和上... 查看详情

并发编程学习小结

...量的需要,定制自己线程池的大小。虽然通过这个对并发编程已经有了一定的了解,但是个人认为自己目前对于java的并发编程只是局限于使用和浅层的了解阶段,在这里先对自己这段时间的学习做个总结。    首先... 查看详情

java并发编程小结

...线程。多线程可以最大限度的使用CPU和维护各线程之间的并发进行关系等。一、concurrent并发包locks部分:显式锁(互斥锁 查看详情

go语言学习之旅--并发编程

Go语言学习之旅--并发编程golang并发编程之协程golang并发编程之通道golang并发编程之WaitGroup实现同步golang并发编程之runtime包golang并发编程之Mutex互斥锁实现同步golang并发编程之channel的遍历golang并发编程之selectswitchgolang并发编程之T... 查看详情

go语言学习之旅--并发编程

Go语言学习之旅--并发编程golang并发编程之协程golang并发编程之通道golang并发编程之WaitGroup实现同步golang并发编程之runtime包golang并发编程之Mutex互斥锁实现同步golang并发编程之channel的遍历golang并发编程之selectswitchgolang并发编程之T... 查看详情

实战并发编程-04基于不可变模式解决并发问题_2

...ter实例的方法,便于用来刷新整个服务商信息小结Pre实战并发编程-03基于不可变模式解决并发问题_1中我们通过一个案例了解了可变类可能会导致什么样的线程安全问题,同时也学习了什么是不可变类,如何将一个可变 查看详情

go语言学习之旅--并发编程

Go语言学习之旅--并发编程golang并发编程之协程golang并发编程之通道golang并发编程之WaitGroup实现同步golang并发编程之runtime包golang并发编程之Mutex互斥锁实现同步golang并发编程之channel的遍历golang并发编程之selectswitchgolang并发编程之T... 查看详情

《java虚拟机并发编程》学习笔记

   对《Java虚拟机并发编程》这本书真的是相见恨晚。以前对并发编程只是懂个皮毛,这本书让我对并发编程有了一个全新的认识。所以把书上的知识点做下笔记,以便以后复习使用。并发与并行  仔细说来,并发和并... 查看详情

多线程编程学习笔记——使用并发集合

接上文多线程编程学习笔记——使用并发集合(一)接上文多线程编程学习笔记——使用并发集合(二)  四、  使用ConcurrentBag创建一个可扩展的爬虫 本示例在多个独立的即可生产任务又可消费任... 查看详情

java并发编程学习笔记

Java编程思想,并发编程学习笔记.一.基本的线程机制 1.定义任务:Runnable接口 线程可以驱动任务,因此需要一种描述任务的方式,这可以由Runnable接口来提供.要想定义任务,只需实现Runnable接口并编写run方法,使得该任务可以执行... 查看详情

并发编程学习(代码片段)

...ModificationException出现的原因是因为以前的容器没有考虑到并发情况下读取的时候删除元素而引起的。wait/notify:  wait和notify是Object类的方法,wait会释放锁,notify不释放锁。这两个必须配合synchronized一同使用。并发容器:Conc... 查看详情

并发编程

前言该系列为并发编程,在几乎所有的编程语言中,并发始终是绕不开的坎,可以说学习一门编程语言,学好了并发就说明这门语言你学的还可以.所以接下来就让我们好好看看python的并发是怎么实现的吧.在学习并发之前,有必要学习... 查看详情

第13周软编学习小结

...教学方式,没有养成自己主动学习的习惯,不过我有通过编程序,敲代码来提高自己对软件编程的学习与认识。     &nb 查看详情

concurrenthashmap源码阅读小结(代码片段)

...hMap相关源码分析的文章链接:ConcurrentHashMap扩容分析拾遗并发编程——ConcurrentHashMap#addCount()分析并发编程——C 查看详情

并发编程——基础概念

...带作者和原文地址链接。违者,作者保留追究权利。前言并发编程在我们日常开发中是时时刻刻都有在用的,只不过大部分的代码底层已经帮我们去做了一些并发编程的安全处理,但是还是有很多情况下需要我们自己去控制,所... 查看详情

史上最全的并发编程学习目录

目录一:线程基础知识1.并发编程的基本概念2.线程的基本操作3.线程之间的通信wait和notify4.join和yield以及sleep详解5.synchronized关键字讲解6.volatile原理7.线程组8.线程优先级9.守护线程10.ThreadLocal二:JDK并发包1.jdk并发工具类2.jdk并发... 查看详情

go语言学习笔记—进阶—并发编程:轻量级线程goroutine——并发与并行

并发编程并发指在同一时间内可以执行多个任务。并发编程包含多线程编程、多进程编程、分布式程序等。go语言的并发是指多线程并发,通过goroutine完成goroutine类似线程,可以根据需要创建多个goroutine并发工作goroutine是... 查看详情