自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

  • 博客(208)
  • 收藏
  • 关注

原创 csdn与博客园同步写作

从这个月开始,我将开始在csdn与博客园上同步更新博客。我博客园的博客地址为:https://www.cnblogs.com/xiaoyh/我已经在博客园上坚持分享快两年了,算得上是一个老博主了,希望各位读者喜欢并且点个关注。由于自己是第一次在csdn这个平台上写作,还不是熟悉里面的功能,希望读者见谅。我写博客的初衷是为了巩固自己所学的知识,也为自己平常遇到的一些问题做一些总结,还会分享自己的学习的一些其他内容,除开写代码外,也会记录一些其他软技能方面的记录。

2022-09-02 21:09:30 554

原创 Java并发(二十五)----异步模式之生产者/消费者

要点与Java并发(二十二)----同步模式之保护性暂停中的保护性暂停中的 GuardObject 不同,不需要产生结果和消费结果的线程一一对应这样的好处是消费队列可以用来平衡生产和消费的线程资源生产者仅负责产生结果数据,不关心数据该如何处理,而消费者专心处理结果数据消息队列是有容量限制的,满时不会再加入数据,空时不会再消耗数据JDK 中各种阻塞队列,采用的就是这种模式。

2024-04-17 21:54:50 173

原创 Java并发(二十四)----wait、notify、notifyAll、join区别与联系

当调用notify()方法后,将从对象的等待池中移走一个任意的线程并放到锁标志等待池中,只有锁标志等待池中线程能够获取锁标志;3、调用wait()后必须调用notify()或notifyAll()后线程才会从等待池进入到锁池,当我们的线程竞争得到同步锁后就会重新进入绪状态等待cpu资源分配。如在线程B中调用线程A的join(),那线程B会进入到阻塞队列,直到join结束或中断线程B才开始进入阻塞队列。notifyAll()则从对象等待池中移走所有等待那个对象的线程并放到锁标志等待池中。

2024-04-07 20:31:14 413

原创 Java并发(二十三)----同步模式之保护性暂停

即 Guarded Suspension,用在一个线程等待另一个线程的执行结果要点有一个结果需要从一个线程传递到另一个线程,让他们关联同一个 GuardedObject如果有结果不断从一个线程到另一个线程那么可以使用消息队列JDK 中,join 的实现、Future 的实现,采用的就是此模式因为要等待另一方的结果,因此归类到同步模式。

2024-02-04 20:32:13 415

原创 Java并发(二十二)----wait notify的正确姿势

开始之前先看看,和的区别:1) sleep 是 Thread 的静态方法,而 wait 是 Object 的方法2) sleep 不需要强制和 synchronized 配合使用,但 wait 需要和 synchronized 一起用3) sleep 在睡眠的同时,不会释放对象锁的,但 wait 在等待的时候会释放对象锁4) 它们状态 TIMED_WAITING建议:锁对象加final修饰,这样锁对象不可变。

2024-01-11 21:44:57 489

原创 Java并发(二十一)----wait notify介绍

obj.wait()让进入 object 监视器的线程到 waitSet 等待在 object 上正在 waitSet 等待的线程中挑一个唤醒让 object 上正在 waitSet 等待的线程全部唤醒它们都是线程之间进行协作的手段,都属于 Object 对象的方法。必须获得此对象的锁,才能调用这几个方法,否则会报IllegalMonitorStateException​​log.debug("执行....");// 让线程在obj上一直等待下去。

2023-12-25 22:19:22 482 1

原创 Java并发(二十)----synchronized原理进阶

是因为Java中有一个JIT(即时编译器),会对于反复执行的代码进行优化,b中o对象根本不会被共享,所以b中的synchronized是没有任何意义的,所以Java就把锁给消除了。小南和小女商量了一下,约定不锁门了,而是谁用房间,谁把自己的书包挂在门口,但他们的书包样式都一样,因此每次进门前得翻翻书包,看课本是谁的,如果是自己的,那么就可以进门,这样省的上锁解锁了。于是,小南干脆在门上刻上了自己的名字:【小南专属房间,其它人勿用】,下次来用房间时,只要名字还在,那么说明没人打扰,还是可以安全地使用房间。

2023-12-19 21:00:47 943

原创 Java并发(十九)----Monitor原理及Synchronized原理

每个 Java 对象都可以关联一个 Monitor 对象,如果使用 synchronized 给对象上锁(重量级)之后,该对象头的 Mark Word 中就被设置指向 Monitor 对象的指针。在 Thread-2 上锁的过程中,如果 Thread-3,Thread-4,Thread-5 也来执行 synchronized(obj),就会进入 EntryList BLOCKED。Thread-2 执行完同步代码块的内容,然后唤醒 EntryList(阻塞队列) 中等待的线程来竞争锁,竞争是非公平的。

2023-12-17 21:01:51 538

原创 Java并发(十八)----常见线程安全类及实例分析

或许有疑问,String 有 replace,substring 等方法【可以】改变值啊,那么这些方法又是如何保证线程安全的呢?String、Integer 等都是不可变类,因为其内部的状态不可以改变,因此它们的方法都是线程安全的。原因为,原值并没有被改变,而是创建了一个新值,其内部的状态没有改变,因此它们的方法都是线程安全的。这里说它们是线程安全的是指,多个线程调用它们同一个实例的某个方法时,是线程安全的。其中 foo 的行为是不确定的,可能导致不安全的发生,被称之为。它们的每个方法是原子的。

2023-12-12 21:19:43 513

原创 Java并发(十七)----变量的线程安全分析

情况2:在 情况1 的基础上,为 ThreadSafe 类添加子类,子类覆盖 method2 或 method3 方法,即。因为method3新开了一个线程,造成多个线程访问同一个共享资源,就会存在线程安全的问题。每个线程调用 test1() 方法时局部变量 i,会在每个线程的栈帧内存中被创建多份,因此不存在共享。无论哪个线程中的 method2 引用的都是同一个对象中的 list 成员变量。如果它们被共享了,根据它们的状态是否能够改变,又分两种情况。如果该对象没有逃离方法的作用访问,它是线程安全的。

2023-12-10 21:41:30 416

原创 Java并发(十六)----线程八锁

3 1s后 12 、 23 1s后 1 、 32 1s后 1。,没有互斥,同时运行,2先打印,sleep 1秒后打印1。,锁住的对象不同,所以和题4一样,不存在互斥。,锁住的对象不同,所以和题4一样,不存在互斥。,锁着的同一个对象,还是看cpu先调度哪个线程。,3肯定是最开始的打印的,就看1或2谁先打印。都是有可能的,就看cpu先调度哪个线程。1s 后12, 或 2 1s后 1。1s 后12, 或 2 1s后 1。1s后12,或 2 1s后 1。,还是看cpu先调度哪个线程。,还是看cpu先调度哪个线程。

2023-12-02 11:54:48 440

原创 Java并发(十五)----synchronized解决共享的问题

为了避免临界区的竞态条件发生,有多种手段可以达到目的。阻塞式的解决方案:synchronized,Lock非阻塞式的解决方案:原子变量此次介绍使用阻塞式的解决方案:synchronized,来解决上述问题,即俗称的【对象锁】,它采用互斥的方式让同一时刻至多只有一个线程能持有【对象锁】,其它线程再想获取这个【对象锁】时就会阻塞住。这样就能保证拥有锁的线程可以安全的执行临界区内的代码,不用担心线程上下文切换。

2023-08-30 22:03:47 269

原创 Java并发(十四)----悲观互斥与乐观重试

另外一种是乐观锁思想,它其实不是互斥。互斥实际是悲观锁的思想。例如,有下面取款的需求。

2023-07-27 20:10:17 193

原创 Java并发(十三)----共享存在的问题

一个程序运行多个线程本身是没有问题的问题出在多个线程访问共享资源多个线程读共享资源其实也没有问题在多个线程对共享资源读写操作时发生指令交错,就会出现问题一段代码块内如果存在对共享资源的多线程读写操作,称这段代码块为临界区

2023-07-26 20:19:26 172

原创 Java并发(十二)----线程应用之多线程解决烧水泡茶问题

统筹方法,是一种安排工作进程的数学方法。它的实用范围极广泛,在企业管理和基本建设中,以及关系复杂的科研项目的组织与管理中,都可以应用。怎样应用呢?主要是把工序安排好。比如,想泡壶茶喝。当时的情况是:开水没有;水壶要洗,茶壶、茶杯要洗;火已生了,茶叶也有了。怎么办?办法甲:洗好水壶,灌上凉水,放在火上;在等待水开的时间里,洗茶壶、洗茶杯、拿茶叶;等水开了,泡茶喝。办法乙:先做好一些准备工作,洗水壶,洗茶壶茶杯,拿茶叶;一切就绪,灌水烧水;坐待水开了,泡茶喝。办法丙:洗净水壶,灌上凉水,放在

2023-06-27 21:25:35 298 1

原创 Java并发(十一)----线程五种状态与六种状态

【初始状态】仅是在语言层面创建了线程对象,还未与操作系统线程关联【可运行状态】(就绪状态)指该线程已经被创建(与操作系统线程关联),可以由 CPU 调度执行【运行状态】指获取了 CPU 时间片运行中的状态当 CPU 时间片用完,会从【运行状态】转换至【可运行状态】,会导致线程的上下文切换【阻塞状态】如果调用了阻塞 API,如 BIO 读写文件,这时该线程实际不会用到 CPU,会导致线程上下文切换,进入【阻塞状态】等 BIO 操作完毕,会由操作系统唤醒阻塞的线程,转换至【可运行状态】

2023-06-15 20:08:05 534

原创 Java并发(十)----线程之守护线程

默认情况下,Java 进程需要等待所有线程都运行结束,才会结束。有一种特殊的线程叫做守护线程,只要其它非守护线程运行结束了,即使守护线程的代码没有执行完,也会强制结束。Tomcat 中的 Acceptor 和 Poller 线程都是守护线程,所以 Tomcat 接收到 shutdown 命令后,不会等待它们处理完当前请求。垃圾回收器线程就是一种守护线程。

2023-06-15 20:07:26 203

原创 Java并发(九)----线程join、interrupt

stop 方法会真正杀死线程,如果这时线程锁住了共享资源,那么当它被杀死后就再也没有机会释放锁, 其它线程将永远无法获取锁。注意:这个打断标记只是一个标记信号,并不会结束线程的执行,一般是根据这个标记信号来决定是否结束当前线程。正常运行状态的如果打断,那么打断标记为true,如果是阻塞状态被打断,那么其打断状态为false。interrupt 可以打断正在执行的线程,无论这个线程是在 sleep,wait,还是正常运行。因为主线程和线程 t1 是并行执行的,t1 线程需要 1 秒之后才能算出。

2023-06-01 22:45:43 627

原创 Java并发(八)----使用线程避免cpu占用100%

在没有利用 cpu 来计算时,不要让 while(true) 空转浪费 cpu,这时。不同的是,后两种都需要加锁,并且需要相应的唤醒操作,一般适用于要进行同步的场景。可以用 wait 或 条件变量达到类似的效果。sleep 适用于无需锁同步的场景。

2023-06-01 22:40:32 270

原创 Java并发(七)----线程sleep、yield、线程优先级

2.是否考虑线程优先级:sleep方法不会考虑线程优先级,当一个线程调用sleep方法释放CPU后,所有优先级级别的线程都有机会获得CPU。当一个线程调用sleep方法释放CPU后,与该线程具有同等优先级,或优先级比该线程高的线程有机会获得CPU。5.是否有参数:sleep方法在Thread类中有两种重载形式,sleep(long ms),sleep(long ms,int nanos)yield方法没有参数。如果 cpu 比较忙,那么优先级高的线程会获得更多的时间片,但 cpu 闲时,优先级几乎没作用。

2023-05-30 22:01:35 606

原创 Java并发(六)----线程start、run、state方法

使用 start 是启动新的线程,通过新的线程间接执行 run 中的代码。直接调用 run 是在主线程中执行了 run,没有启动新的线程。程序仍在 main 线程运行,程序在 t1 线程运行,

2023-05-15 19:26:47 120 1

原创 Java并发(五)----线程常见方法总结

线程常见方法总结

2023-05-15 19:25:19 446

原创 Java并发(四)----线程运行原理

我们都知道 JVM 中由堆、栈、方法区所组成,其中栈内存是给谁用的呢?其实就是线程,每个线程启动后,虚拟机就会为其分配一块栈内存。每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法

2023-05-05 22:14:41 455

原创 Java并发(三)----创建线程的三种方式及查看进程线程

FutureTask (未来任务)能够接收 Callable 类型的参数,用来处理有返回结果的情况。查看某个 Java 进程(PID)的所有线程状态 ,只能查看某一刻某个进程所有线程较详细的状态。方法1 是把线程和任务合并在了一起,方法2 是把线程和任务分开了。查看某个进程(PID)的所有线程,可持续查看线程的状态。Runnable 可运行的任务(线程要执行的代码)任务管理器可以查看进程和线程数,也可以用来杀死进程。把【线程】和【任务】(要执行的代码)分开。查看某个进程(PID)的所有线程。

2023-04-24 22:08:33 1411

原创 Eclipse环境搭建并且运行wordcount程序

hadoop2.0伪分布式环境平台正常运行所需压缩包:eclipse-jee-luna-SR2-linux-gtk-x86_64.tar.gz在Linux环境下运行的eclipse软件压缩包,解压后文件名为eclipse在eclipse中需要安装的Hadoop插件,解压后文件名为hadoop2x-eclipse-plugin-master如图所示,将所有的压缩包放在同一个文件夹下并解压。

2023-04-17 22:10:31 666

原创 Hadoop2.0伪分布式平台环境搭建

环境:ubuntu-16.04这里的环境不一定需要和我一样,基本版本差不多都ok的,所需安装包和压缩包自行下载即可。因为这里是配置Hadoop的教程,配置Java以及安装VMware Tools就自行百度解决哈,这里就不写了(因为教程有点长,可能有些地方有些错误,欢迎留言评论,我会在第一时间修改的)。

2023-04-17 22:08:24 427

原创 Hadoop Partition函数应用(归档)

得到map产生的记录后,他们该分配给哪些reducer来处理呢?hadoop默认是根据散列值来派发,但是实际中,这并不能很高效或者按照我们要求的去执行任务。例如,经过partition处理后,一个节点的reducer分配到了20条记录,另一个却分配到了10W万条,试想,这种情况效率如何。

2023-04-13 21:59:29 543

原创 Java并发(二)----初次使用多线程并行提高效率

IO 操作不占用 cpu,只是我们一般拷贝文件使用的是【阻塞 IO】,这时相当于线程虽然不用 cpu,但需要一直等待 IO 结束,没能充分利用线程。但如果是四核 cpu,各个核心分别使用线程 1 执行计算 1,线程 2 执行计算 2,线程 3 执行计算 3,那么 3 个线程是并行的,花费时间只取决于最长的那个线程运行的时间,即。单核 cpu 下,多线程不能实际提高程序运行效率,只是为了能够在不同的任务之间切换,不同线程轮流使用 cpu ,不至于一个线程总占用 cpu,别的线程没法干活。

2023-04-13 21:56:15 956

原创 Java并发(一)----进程、线程、并行、并发

操作系统中有一个组件叫做任务调度器,将 cpu 的时间片(windows 下时间片最小约为 15 毫秒)分给不同的线程使用,只是由于 cpu 在线程间(时间片很短)的切换非常快,人类感觉是。大部分程序可以同时运行多个实例进程(例如记事本、画图、浏览器等),也有的程序只能启动一个实例进程(例如网易云音乐、360 安全卫士等)都可以调度运行线程,这时候线程可以是并行的。不同计算机之间的进程通信,需要通过网络,并遵守共同的协议,例如 HTTP。进程基本上相互独立的,而线程存在于进程内,是进程的一个子集。

2023-04-10 20:45:30 399

原创 Hadoop 倒排索引

当你把需要处理的文档上传到hdfs时,首先默认的TextInputFormat类对输入的文件进行处理,得到文件中每一行的偏移量和这一行内容的键值对做为map的输入。在改写map函数的时候,我们就需要考虑,怎么设计key和value的值来适合MapReduce框架,从而得到正确的结果。这就像百度里的搜索,你输入一个关键字,那么百度引擎就迅速的在它的服务器里找到有该关键字的文件,并根据频率和其他的一些策略(如页面点击投票率)等来给你返回结果。这个过程中,倒排索引就起到很关键的作用。

2023-04-10 20:43:19 599

原创 Hadoop 电话通信清单

源文件——》Mapper(分隔原始数据,以被叫作为key,以主叫作为value)——》Reducer(把拥有相同被叫的主叫号码用|分隔汇总)——》输出到HDFS。现有一批电话通信清单,记录了用户A拨打某些特殊号码(如120,10086,13800138000等)的记录。需要做一个统计结果,记录拨打给用户B的所有用户A。

2023-04-10 20:41:46 452

原创 Hadoop 多表关联

相比单表关联,多表关联的左右表和连接列更清楚,因此可以采用和单表关联相同的处理方式。Map识别出输入的行属于哪个表之后,对其进行分割,将连接的值保存在key中,另一列和左右表标志保存在value中,然后输出。Reduce拿到连接结果后,解析value内容,根据标志将左右表内容分开存放,然后求笛卡尔积,最后直接输出。要求从输入数据中找出工厂名和地址名的对应关系,输出工厂名-地址名表。多表关联和单表关联类似,它也是通过对原始数据进行一定的处理,从其中挖掘出关心的信息。

2023-04-05 20:29:58 469

原创 Hadoop 单表关联

分析这个实例,显然需要进行单表连接,连接的是左表的parent列和右表的child列,且左表和右表是同一个表。再与最开始的分析联系起来:要连接的是左表的parent列和右表的child列,且左表和右表是同一个表,所以在Map阶段将读入数据分割成child和parent之后,会将parent设置成key,child设置成value进行输出,作为左表;取出每个key的value-list进行解析,将左表中的child放入一个数组,右表中的parent放入一个数组,然后对两个数组求笛卡尔积就是最后的结果了。

2023-04-05 20:28:26 398

原创 设计模式(三十二)----综合应用-自定义Spring框架-自定义Spring IOC-自定义Spring IOC总结

1.1 使用到的设计模式工厂模式。这个使用工厂模式 + 配置文件的方式。单例模式。Spring IOC管理的bean对象都是单例的,此处的单例不是通过构造器进行单例的控制的,而是spring框架对每一个bean只创建了一个对象。模板方法模式。AbstractApplicationContext类中的finishBeanInitialization()方法调用了子类的getBean()方法,因为getBean()的实现和环境息息相关。迭代器模式。

2023-04-05 20:21:26 367

原创 Hadoop 排序

需要注意的是,Reduce自动排序的数据仅仅是发送到自己所在节点的数据,使用默认的排序并不能保证全局的顺序,因为在排序前还有一个partition的过程,默认无法保证分割后各个Reduce上的数据整体是有序的。其次需要重写partition,保证整体有序,具体做法是用输入数据的最大值除以系统partition数量的商作为分割数据的边界增量,也就是说分割数据的边界为此商的1倍、2倍至numPartitions-1倍,这样就能保证执行partition后的数据是整体有序的;对输入文件中的数据进行排序。

2023-04-03 19:55:52 219

原创 图像分类综述

什么是图像分类,核心是从给定的分类集合中给图像分配一个标签的任务。实际上,这意味着我们的任务是分析一个输入图像并返回一个将图像分类的标签。标签来自预定义的可能类别集。示例:我们假定一个可能的类别集categories = {dog, cat, eagle},之后我们提供一张图1给分类系统:这里的目标是根据输入图像,从类别集中分配一个类别,这里为dog,我们的分类系统也可以根据概率给图像分配多个标签,如dog:95%,cat:4%,eagle:1%。

2023-04-03 19:53:16 1721

原创 设计模式(三十一)----综合应用-自定义Spring框架-自定义Spring IOC-定义解析器、IOC容器相关类

3.1 BeanDefinitionReader接口BeanDefinitionReader是用来解析配置文件并在注册表中注册bean的信息。定义了两个规范:获取注册表的功能,让外界可以通过该对象获取注册表对象。加载配置文件,并注册bean数据。/*** 用来解析配置文件的,而该接口只是定义了规范*/​//获取注册表对象//加载配置文件并在注册表中进行注册3.2 XmlBeanDefinitionReader类。

2023-04-03 19:52:11 392

原创 Hadoop 数据去重

数据去重实例的最终目标是让原始数据中出现次数超过一次的数据在输出文件中只出现一次。所以从设计好的Reduce输入可以反推出Map输出的key应为数据,而value为任意值。而在这个实例中每个数据代表输入文件中的一行内容,所以Map阶段要完成的任务就是在采用Hadoop默认的作业输入方式之后,将value设置成key,并直接输出(输出中的value任意)。在Reduce阶段不管每个key有多少个value,都直接将输入的key复制为输出的key,并输出就可以了(输出中的value被设置成空)

2023-03-30 21:02:46 728

原创 一次完整的OCR实践记录

这次的任务是对两百余张图片里面特定的编号进行识别,涉及保密的原因,这里就不能粘贴出具体的图片了,下面粘贴出一张类似需要识别的图片。假如说我的数据源如上图所示,那么我需要做的工作就是将上面图片里面标红的数字给识别出来。我采用的算法是,这是基于Tensorflow和keras框架采用ctpn+densenet+CTC算法来完成对图片指定内容的字符识别。

2023-03-30 20:59:32 837

原创 设计模式(三十)----综合应用-自定义Spring框架-自定义Spring IOC-定义bean、注册表相关类

1.1 PropertyValue类用于封装bean的属性,体现到上面的配置文件就是封装bean标签的子标签property标签数据。/*** @Description: 用来封装bean标签下的property标签的属性* name属性* ref属性* value属性 : 给基本数据类型及String类型数据赋的值*/​​​​​​return ref;​​​1.2 MutablePropertyValues类。

2023-03-30 20:51:46 652

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除