首页 > 编程语言 >JUC并发编程

JUC并发编程

时间:2022-12-05 18:22:22浏览次数:39  
标签:JUC 多个 等待 Lock 编程 并发 线程 方法

什么是JUC

JDK1.5出现的,用来处理线程的工具包

进程与线程

进程:指在系统中正在运行的一个应用程序;程序一旦运行就是进程;进程一 -资源分配的最小单位。
线程:系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元执行流。线程一程序执行的最小单位。

线程的状态

NEW(新建)、RUNNABLE(可运行)、BLOCKED(阻塞)、WAITING(等待)、TIMED_WAITING(定时等待)、TERMINATED(终止)

wait和sleep区别

①sleep是Thread的静态方法,wait是Object的方法任何对象实例都能调用
②sleep不会释放锁也不会占用锁。wait会释放锁,但调用前提是当前线程有锁
③都可以被interrupted方法中断

并发与并行

解释一:并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。
解释二:并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。
解释三:在一台处理器上“同时”处理多个任务,在多台处理器上同时处理多个任务。


并发:指的是多个事情,在同一时间段内同时发生了,多个任务之间是互相抢占资源的。
并行:指的是多个事情,在同一时间点上同时发生了,多个任务之间是不互相抢占资源的。

只有在多CPU的情况中,才会发生并行。否则,看似同时发生的事情,其实都是并发执行的。

Lock 和 Synchronized

①Synchronized是Java关键字,是同步锁。可修饰代码块、方法(不被子类继承)、静态方法、类
②发生异常会自动释放锁,如果被阻塞会一直无限期等待
③synchronized实现同步的基础:Java中的每一个对象都可以作为锁。具体表现为以下3种形式。
对于普通同步方法,锁是当前实例对象。
对于静态同步方法,锁是当前类的class对象。
对于同步方法块,锁是Synchonized括号里配置的对象。


①Lock是一个接口,通过这个接口的实现类可以实现同步访问,必须要用户手动释放锁,如果不释放会发生死锁。
②Lock可以让等待锁的线程响应中断,Synchronized却不行,等待线程会一直等待下去
③Lock可以知道有没有成功获取锁
④Lock可以提高多个线程进行读操作的效率

线程间的通信 等待/通知

①关键字Synchronized通过wait()/notify()两个方法实现等待/通知。
②Lock锁的newCondition()方法返回Condition对象,Condition类也可以实现等待/通知。

区别:
notify()随机唤醒,使用Condition可以选择性通知,condition比较常用的两个方法:
• await()会使当前线程等待,同时会释放锁,当其他线程调用 signal()时,线程会重新获得锁并继续执行。
• signal()用于唤醒一个等待的线程。

Lock 和 ReadWriteLock 接口

Lock的实现类ReentrantLock可重入锁
ReadWriteLock的实现类ReentrantReadWriteLock可重入读写锁,读写锁分开,从而使得线程可以同时进行读操作
注意:
有一个线程占用读锁,其他线程申请写锁会等待读锁释放
有一个线程占用写锁,其它线程申请写锁或读锁会一直等待释放写锁

集合的线程安全

Vector

所有的方法,都是通过synchronized修饰,方法锁,实际也是对象锁,安全

Collections

Collections 提供了方法 synchronizedList 保证 list 是同步线程安全的
都是通过mutex对象加锁,一样,效率和Vector一样低

CopyOnWriteArrayList(重点)

写时复制的方法,来控制的读写分离。但是存在的问题就是,会出现脏读的现象

Callable&Future 接口

创建线程的方法,一种是通过Threa类,另一种使用Runnable创建线程,无法使线程返回结果,而Callable可以。

Callable接口

Runnable只需要实现不返回任何内容的run()方法,对于Callable需要实现完成时返回结果的call()方法。
call()方法可以引发异常,而run()不能
new Thread(Runnable r)不能直接替换Runnable,因为Thread类构造方法没有Callable

标签:JUC,多个,等待,Lock,编程,并发,线程,方法
From: https://www.cnblogs.com/ZZyy-/p/16952208.html

相关文章

  • Java 编程基础01
    一、Java开发环境搭建1、开发工具的下载和安装   1)下载方式一:官网下载www.sun.com     www.oracle.com   2)下载方式二:通过搜索下载www.baidu.c......
  • [C++11与并发编程]7、本地变量线程安全
    本地变量线程安全layout:posttitle:本地变量线程安全categories:cpp_concurrencydescription:C++并发编程简介keywords:c++,并发编程,本地变量线程安全​本地变量......
  • JAVA解决并发问题
    解决并发问题 解决可见性,有序性,原子性原子性 Java内存模型只保证了基本读取和赋值是原子性操作,如果要实现更大范围操作的原子性,可以通过synchronized和Lock来实现。......
  • [C++11与并发编程]5、使用条件变量和互斥锁实现信号量
    使用条件变量和互斥锁实现信号量layout:posttitle:使用条件变量和互斥锁实现信号量categories:cpp_concurrencydescription:C++并发编程简介keywords:c++,并发编......
  • [C++11与并发编程]条件变量在生产者-消费者模型中的使用
    条件变量在生产者-消费者模型中的使用layout:posttitle:条件变量在生产者-消费者模型中的陷阱categories:cpp_concurrencydescription:C++并发编程简介keywords:c+......
  • PowerBuilder编程新思维6:装饰(用最简单的方式做框架)
     Tobe,ornottobe-thatisthequestion. PowerBuilder编程新思维6:装饰(用最简单的方式做框架) 问题这一章,是写得最艰难的一章,原因有四:一、WUI的范畴实在太......
  • java并发数据结构之CopyOnWriteArrayList
    CopyOnWriteArrayList是一个线程安全的List实现,其在对对象进行读操作时,由于对象没有发生改变,因此不需要加锁,反之在对象进行增删等修改操作时,它会先复制一个对象副本,然后对......
  • Java 编程入门第一课:HelloWorld
    在之前的文章中,壹哥带大家搭建出了Java的开发环境,配置了JDK环境变量,并且我们也熟悉了dos命令行的操作。那么从这篇文章开始,壹哥就开始带各位真正地学习Java代码该......
  • 用NetCore + ReactJS 实现一个前后端分离的网站 (5) 日志 - log4net & AOP切面编程
    用NetCore+ReactJS实现一个前后端分离的网站(5)日志-log4net&AOP切面编程1.前言日志始终是跟踪与调试程序的最佳手段,因为调试难以溯及既往,而日志则能忠实地记......
  • C#摄像头编程
    这段时间搞视频采集方面的程序,在国外网站上找到一个用C#写的驱动摄像头的程序。经改造和调试,如下:(1)安装摄像头后,一般可以找到一个avicap32.dll文件(2)这是一个关于摄像头的......