![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
SpaceX7_s
初学小白,欢迎技术交流
展开
-
初学线程池
经常创建和销毁线程,会使用特别大的资源;提前创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中,可以避免频繁地创建销毁,实现重复利用.类似生活中的公共交通工具;使用线程池的优点:(1)提高效应速度;(2)降低资源消耗;(3)便于线程管理 corePoolSize 核心池大小maximumPoolSize:最大线程数 keepAliveTime:线程没有任务时最多保持多长时间后会终止.代码实践public class TextPool { public static vo.原创 2021-05-08 00:08:40 · 42 阅读 · 0 评论 -
并发协作模型 “ 生产者 / 消费者模式 ” -----信号灯法
观众演员实例//生产者消费者问题,信号灯法,标志位解决public class TextPc02 { public static void main(String[] args) { Tv tv = new Tv(); new Actor(tv).start(); new Watcher(tv).start(); }}//演员class Actor extends Thread{ Tv tv; public Actor原创 2021-05-07 23:38:59 · 150 阅读 · 0 评论 -
多线程——生产者消费者问题-----管程法
理论整理问题描述:这是一个线程同步问题,生产者和消费者共享一个资源,并且生产者和消费者之间相互依赖,相为条件1.生产者在没有生产产品之前要通知消费者等待,而在生产之后又要通知消费者消费2.对于消费者,消费者结束消费之后,要通知生产者生产新的产品以供消费3.生产者消费者问题,仅有synchronized是不够的synchronize可阻止并发更新同一个资源,实现了同步synchronize实现不了不同线程之间的消息联系(通信)解决思路:设计模式:代码实现://生产者消费者模型,利用缓原创 2021-05-06 23:44:00 · 228 阅读 · 1 评论 -
Lock锁
理论整理1.Lock是显式锁(手动开启,手动关闭,千万不能忘记关闭锁),synchronized是隐式锁,出了作用域会自动释放;2.Lock只能锁代码块,synchronized可以锁代码块和方法;3.ReentrantLock类实现了Lock,它拥有与synchronized相同的并发性和内存语言,在实现线程安全的控制中,比较常用的是ReentrantLock,因为它可以显式加锁和释放锁代码实践public class Text { public static void main(Str原创 2021-05-05 22:00:54 · 88 阅读 · 0 评论 -
死锁
A拥有B想要拥有的,B拥有A想要拥有的,两者互不让步就可能会一直僵持下去; 某一个同步块同时拥有"两个以上对象的锁"时,就可能发生死锁问题。产生死锁的四个必要条件:1.互斥条件:一个资源每次只能被一个进程使用;2.请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放;3.不剥夺条件:进程已获得的资源,在未使用完之前不能强行剥夺;4. 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。//死锁:多个线程互相占的对方所需的资源,相互僵持public class Dea.原创 2021-05-05 21:51:18 · 76 阅读 · 0 评论 -
JUC中安全类集合CopyOnWriteArrayList
CopyOnWriteArrayList 类实现List并继承 RandomAccess 接口,因此提供 ArrayList 类中可用的所有功能。使用 CopyOnWriteArrayList 进行更新操作的成本很高,因为每个迭代器都会创建基础数组的克隆副本,并为其添加/更新元素。它是 ArrayList 的线程安全版本。每个访问列表的线程在初始化此列表的迭代器时都会看到自己创建的快照版本。因为它在创建迭代器时获取基础数组的快照,所以它不会抛出 ConcurrentModificationExcept原创 2021-05-05 21:43:33 · 76 阅读 · 0 评论 -
同步方法和同步块
从上一节中可以看到Java中多线程是不安全的,比如多人同时买票,票数会出现负数的情况;多人取钱,钱数会出现负数;多个线程操作同一个列表会出现多个线程覆盖列表统一地方的错误等;Java中提供了解决该问题的办法:锁机制。 具体而言,锁住当前类的话可以在方法的开头public后加上synchronized;锁住具体对象(比如只锁景区的厕所而不是整个景区)时可以用synchronized(对象){代码块}.1.解决抢票不安全问题public class UnsafeBuyTicket { pub.原创 2021-05-05 21:15:15 · 68 阅读 · 0 评论 -
线程同步机制和三个线程不安全例子
并发: 同一个对象被多个线程同时操作;1.由于同一进程的多个线程共享同一块存储空间,会发生访问冲突问题.为了访问的正确性,在访问时加入了锁机制(synchronized) 。当一个线程获得对象的排它锁时,独占资源,其他线程必须等待,使用后释放锁即可。2.一个线程持有锁会导致其他所有需要此锁的线程挂起;3.在多线程竞争下,加锁,释放锁会导致比较多的上下文切换和调度延时,引起性能问题;4.如果一个优先级高的线程等待一个优先级低的线程释放锁,会导致优先级倒置,引起性能问题1.抢票不安全问题//多个原创 2021-05-05 00:11:25 · 518 阅读 · 2 评论 -
守护线程
线程分为:守护线程和用户线程;虚拟机需要等待用户线程执行完,而不必等待守护线程完成.常见的守护线程:后台记录操作日志,监控内存,垃圾回收等public class Textdaemon { public static void main(String[] args) { God god = new God(); You you =new You(); Thread thread = new Thread(god); thread原创 2021-05-04 01:15:17 · 48 阅读 · 0 评论 -
多线程优先级
Java提供一个线程调度器来监视启动后进去就绪状态的所有线程,线程调度器按照优先级决定应该调度哪个线程来执行.线程的优先级用数字表示,范围从1~10;Thread.MIN_PRIORITY=1;Thread.MAX_PRIORITY=10;Thread.NORM_PRIORITY=5;使用一下方式改变或获取优先级:getPriority().setPriority(int x)public class TextPriority { public static void main(Str原创 2021-05-04 00:16:11 · 68 阅读 · 0 评论 -
多线程Lamda表达式
Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体。Lambda表达式还增强了集合库。 Java SE 8添加了2个对集合数据进行批量操作的包: java.util.function 包以及java.util.stream 包。 流(stream)就如同迭代器(iterator),但附加了许多额外的功能。在Lambda表达式中this是指外围实例,而匿名类中的this原创 2021-04-28 23:54:15 · 210 阅读 · 0 评论 -
多线程静态代理模式(初学)
1.代理类和真实类要实现同一个接口2.代理类要代理真实角色3.代理对象可以实现很多真实对象做不了的事件4.真实类可以专注做自己的事情public class TextStacticproxy { public static void main(String[] args) { new WeddingCompany(new You()).HayyMaryy(); }}//创建接口interface Maryy{ public void HayyMar.原创 2021-04-28 20:38:16 · 55 阅读 · 0 评论 -
多线程实现Runable接口(初学)
Ruanable接口1.定义MyRunable类实现Runable接口2.重写run()方法 编写线性执行体3.创建线性对象,调用start()启动线程体import org.apache.commons.io.FileUtils;import java.awt.*;import java.io.File;import java.io.IOException;import java.net.URL;public class TextRunable implements Runnab原创 2021-04-28 15:58:47 · 919 阅读 · 1 评论 -
继承Tread类(初学)
进程与线程1.进程:指系统中能独立执行的程序称之为进程。是操作系统资源分配的基本单位。双cpu才能实现多进程,每个cpu执行一个进程。单cpu只是不断的切换执行程序,所以看起来像是同时执行多个进程,当实际上切换中有较大开销。2.线程:线程可以看做是轻量级的进程,是任务调度和执行的基本单位。一个进程中至少包括一个线程或者多个线程。一个线程就是一个程序中的一条执行线索,如果要一进程中实现多段代码同时交替运行,就需要产生多个线程,并指定每个线程上面需要运行的代码段,这就是多线程。**创建一个多线性//原创 2021-04-27 00:11:58 · 281 阅读 · 1 评论