自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

腹黑的乌鸡

不定时分享

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

原创 代理池搭建教程

代理池搭建教程

2023-01-03 11:57:47 12248 25

原创 苹果手机用stream获取wskey

苹果手机用stream获取wskey

2022-12-29 10:14:33 4411 2

原创 手机端Alook浏览器手动抓取京东Cookie教程

手机端Alook浏览器手动抓取京东Cookie教程

2022-12-20 14:22:56 3310

原创 Ubuntu20.04设置开机自启动脚本

Ubuntu20.04设置开机自启动脚本

2022-12-02 19:48:09 741

原创 如何避免内存溢出和频繁的垃圾回收

如何避免内存溢出和频繁的垃圾回收内存管理机制的实现原理,就不细谈了,内存的回收过程很复杂,简单的说就是两个步骤:找到所有可以回收的对象,并进行标记回收后清除或者整理内存碎片垃圾回收完成后,一般是需要进行内存碎片管理,将不连续的空闲内存移动到一起,以便空出足够的连续内存空间供后续使用。高并发下的程序为什么会卡死?高并发的情况下,经常有时候会遇到程序卡死的情况。 笔者就曾经遇到过,运维反馈程序CPU 占用飙高,然后去查应用日志,发现输出日志很少,然后查询 GC 日志,发现 Full G

2022-01-06 23:33:33 296 1

原创 docker容器学习(二)

Alpine 的意思是“高山的”,比如 Alpine plants高山植物,Alpine skiing高山滑雪、the alpine resort阿尔卑斯山胜地。Alpine Linux 网站首页注明“Small!Simple!Secure!Alpine Linux is a security-oriented, lightweight Linux distribution based on musl libc and busybox.”Alpine 操作系统是一个面向安全的轻型 Linux 发行版。它

2021-12-03 15:40:16 833

原创 docker容器学习(一)

容器的好处:1、持续部署与测试 DevOps2、跨平台支持3、环境标准化和版本控制4、高资源利用率与隔离5、容器跨平台性与镜像、镜像仓库背景知识说明云计算是一种资源的服务模式,该模式可以实现随时随地、便捷按需地从可配置计算资源共享池中获取所需的资源(如网络、服务器、存储、应用及服务),资源能够快速供应并释放,大大减少了资源管理工作开销,你甚至可以再也不用理会那些令人头痛的传统服务供应商了。经典云计算架构包括IaaS(Infrastructure as a Service,基础设施即服务)、P

2021-11-21 21:17:58 1158

原创 线程讲解(十八)

对象锁改进后的代码用到了一个对象锁,该对象锁默认是当前对象,上述代码等同于以下代码:protected void numberOff() { synchronized (this) { for (int i = 0; i < 5; i++) { num++; System.out.println(Thread.currentThread().getName() + ":" + SynchronizedExample.num); } }}当多个线程用一个对象锁,各个线程

2021-10-28 11:58:04 63

原创 线程讲解(十七)

synchronized关键字,我们一般称之为“同步锁”,用它来修饰需要同步的方法和需要同步代码块,默认是当前对象作为锁的对象。在用synchronized修饰类时(或者修饰静态方法),默认是当前类的Class对象作为锁的对象,故存在着方法锁、对象锁、类锁这样的概念。没有设置线程同步的情况先给出以下代码感受下代码执行的时候为什么需要同步?代码可能比较枯燥,配上业务理解起来就会舒服很多,学生军训,有三列,每列5人,需要报数,每个线程负责每一列报数。class SynchronizedExample {

2021-10-28 11:56:39 68

原创 线程讲解(十六)

fork join框架使用简单实例使用RecursiveTask实现一个累加的功能,使用分而治之的思想,实现分段求和后汇总。public class SumTask extends RecursiveTask<Integer> { private Integer start = 0; private Integer end = 0; public SumTask(int start, int end) { this.start = start;

2021-09-22 10:04:06 74

原创 线程讲解(十五)

Fork/Join 框架的限制Fork/Join 框架执行的任务有如下限制:仅可以使用 fork 和 join 操作作为同步机制;如果使用其他的同步机制,当处于同步操作模式下时任务无法被执行。例如:如果想让一个任务在 Fork/Join 框架内休眠一段时间,执行这个任务的工作线程在休眠期间不会去执行其他任务。任务不能抛出异常。任务不能执行I/O操作。几种线程机制的比较截止到 Fork/Join 框架,已经学习了多种线程机制,如 Thread、Executors 和 Fork/Join;这几种

2021-09-11 16:18:24 70

原创 线程讲解(十四)

Fork/Join 框架中的任务ForkJoinTask 类是所有在 Fork/Join 框架中执行的任务的基类,它提供了一系列机制来实现 Fork 和 Join 操作。该类有两个子类,分别是 RecursiveAction 和 RecursiveTask。从 RecursiveAction 类继承的子类方法一般没有返回值。从 RecursiveTask 类继承的子类方法则有返回值。任务的创建在创建任务时,最好不要从 ForkJoinTask 类直接继承,而是从该类的子类 RecursiveA

2021-09-03 17:44:16 142

原创 线程讲解(十三)

ForkJoinPool 类ForkJoinPool 类是 Fork/Join 框架的核心,也是 Fork/Join 框架执行的入口点,它实现了接口 ExecutorService。ForkJoinPool 类的任务是负责管理线程,并提供线程执行状态和任务处理的相关信息。ForkJoinPool 的创建ForkJoinPool 类从 AbstractExecutorService 类继承,主要用于处理 ForkJoinTask 中的任务。ForkJoinPool 类构造方法有三种形式:1、Fork

2021-08-06 09:59:37 152

原创 线程讲解(十二)

概述Fork/Join 框架是适用于多核处理器上并行编程的轻量级并行框架。该框架主要由 Fork 和 Join 两个操作构成:Fork 操作主要用于对任务和数据进行划分,一般是将一个大问题划分为若干个小问题。Join 操作主要用于对各个部分的运行结果进行合并,相当于程序中的一个障栅。两个操作与MapReduce 中的Map/Reduce 操作类似。Fork/Join 框架实现了任务定义和任务处理功能的分离,使程序员在实现并行编程的同时,将更多的精力实现业务逻辑中。在 Java 语言中,Fo

2021-08-02 09:13:46 105

原创 线程讲解(十一)

固定数目的线程执行器使用 Executors 类的 newFixedThreadPool() 方法可以创建固定数目的线程执行器,线程的数目可以由用户指定;也可以不指定,默认为当前处理器可以处理的最大线程数。ExecutorService executor = Executors.newFixedThreadPool(4);当提交到线程池的 Runnable 对象数大于执行器可以处理的线程数时,将有部分 Runnable 对象等待。使用线程执行器处理有返回值的线程有返回值的线程定义需要继承 Call

2021-07-25 17:45:15 68

原创 线程讲解(十)

线程池前面介绍的内容,都是通过创建线程的方法使程序并行运行的。采用的方法一般是:创建一个 Runnable 对象,然后封装为 Thread 对象,通过 start() 方法启动线程,并在线程运行过程中通过 sleep()、interrupt() 等方法来控制线程的运行。1、之前的程序中,线程的创建、运行、休眠和终止都是要手动完成的,如果需要创建的线程过多的话,这样就很麻烦了。2、创建的线程数量过多或者太少,都不能很好的提高执行效率。3、创建一个新的线程需要的代价很高,尤其是创建多个生命周期较短的线程

2021-07-16 15:58:59 72

原创 线程讲解(九)

同步队列同步队列是一个没有数据缓冲的阻塞队列,在同步队列上插入操作必须等待相应的删除执行完成后才能执行,反之亦然。不能调用peek() 方法查看队列中是否有数据,也不允许对整个队列遍历。类 SynchronousQueue 是 Java 集合框架中的一员。该类的定义形式如下:public class SynchronousQueueextends AbstraceQueueimplements BlockingQueue,Serializable其中 E 指明同步队列中元素的类型。该类定义了

2021-07-12 09:27:12 83

原创 线程讲解(八)

一.背景:1.因根目录/空间不大,故而想将另一硬盘挂载到根目录下(后发现此想法很是幼稚)二.过程:2.成功输入命令挂载后,发现出现/上被挂了两个东西,且/下剩余空间还是原来一样大,才发现大错特错mount /dev/vdb1 /3.查阅资料后,才知道根目录的重要性,且两个设备挂载在同一文件夹df -h会出现只显示一个硬盘的挂载空间信息且是第一个硬盘的空间信息,虽然两个盘名字都显示挂载在上面了,但后者实际上并没有成功。(因为挂载的意义就是磁盘入口的意思,若是两者都能成功,则数据将向哪存储呢?

2021-07-02 18:33:35 62

原创 线程讲解(七)

线程间通信线程作为程序内部的多个执行流,相互之间是可以进行通信的.线程间通信可以通过多种方式来进行,例如:线程间可以通过共享变量进行通信,使每个线程根据共享变量的值进行操作和运算,当通过共享变量进行通信时,通常需要引入线程同步控制;线程间也可以通过wait(),notify()和notifyAll()等方法进行通信.等待集合等待集合(Wait-sets)就像候车室一样,当线程调用wait()方法发生等待后,都要进入到该等待集合中,除非发生一下情况,否则线程会一直在该等待集合中.其他线程调用了方法

2021-06-25 19:01:50 63

原创 线程讲解(六)

锁在程序的设计语言中,锁提供了一种数据安全访问的方式,锁一般分为加锁和解锁两个操作.对共享数据操作前,要先进行加锁;操作完成后,再进行解锁.加锁以后的临界区只能被持有锁的线程占有,其他线程不能进入这段临界区,只能等待.Java 语言提供同步锁,可重入锁和读写锁等同步机制,用于确保数据访问的正确性.同步锁在 JAVA 语言中,从 JDK1.0 开始就支持同步锁的使用了.它可以采用两形式:同步方法和同步代码块.不论哪种方式,都需要使用 synchronized 关键字,但两者表现形式不同.同步方法

2021-06-25 17:40:46 79

原创 线程讲解(五)

障栅CyclicBarrier 类是一个同步辅助类,实现了一个称为障栅的集合点,在不是所有线程都到达集合点前,线程之前可以相互等待.Cyclic 的含义是“循环的,周期的”,代表该障栅在所有等待的线程到达集合点并被释放后可以循环使用.CyclicBarrier 类比较适合于线程数量固定的情况.CyclicBarrier 类的构造方法:CyclicBarrier(int parties) //创建障栅对象;parties为需要等待的线程个数.CyclicBarrier(int parties,Run

2021-06-11 18:00:27 1015

原创 线程讲解(四)

等待集合等待集合(Wait-sets)就像候车室一样,当线程调用wait()方法发生等待后,都要进入到该等待集合中,除非发生一下情况,否则线程会一直在该等待集合中.其他线程调用了方法notify()或notifyAll();其他线程调用了方法interrupt()中断了该线程;方法 wait() 的等待时间结束.wait(),notify(),notifyAll() 方法wait(),notify()或notifyAll()方法是类 Object 中定义的方法,由于 Java 中的类都是 O

2021-06-04 15:44:03 153

原创 误将两块磁盘挂载到根目录解决办法

一.背景:1.因根目录/空间不大,故而想将另一硬盘挂载到根目录下(后发现此想法很是幼稚)二.过程:2.成功输入命令挂载后,发现出现/上被挂了两个东西,且/下剩余空间还是原来一样大,才发现大错特错mount /dev/vdb1 /3.查阅资料后,才知道根目录的重要性,且两个设备挂载在同一文件夹df -h会出现只显示一个硬盘的挂载空间信息且是第一个硬盘的空间信息,虽然两个盘名字都显示挂载在上面了,但后者实际上并没有成功。(因为挂载的意义就是磁盘入口的意思,若是两者都能成功,则数据将向哪存储呢?

2021-05-13 10:32:58 1493

原创 线程讲解(三)

为什么要使用同步控制当多个线程同时对某一个数据区或内存位置进行操作时,如果不施加任何措施,很可能造成数据操作混乱.如同数据库中的 脏读,不可重复读和幻读等情况.基本概念数据竞争当只有一个线程访问数据时,数据竞争基本不会存在;只有多线程同时访问数据时,才会发生数据竞争.数据竞争问题是有至少两个同时执行的线程访问同一个内存位置并且至少有一个线程尝试写入数据而引起的问题.为了避免数据竞争,通常需要在程序中加入同步机制,以保证数据访问的正确性.有些同步机制(如:锁)可以保证数据在某一时间内只有一个线程

2021-05-10 13:59:16 60

原创 线程讲解(二)

线程的管理当线程启动后,可以管理线程,使线程休眠、等待或中断执行等.join() 方法:等待在某些情况下,一个线程需要等另外一个线程执行结束后,才能执行.这种功能可以使用join()方法实现.当调用了某个线程类的对象实例的join()方法,则会等待该对象执行结束.sleep() 方法线程的 sleep() 方法使一个线程暂停一段固定的时间,该方法能够把CPU让给优先级比其低的线程.yield() 方法:让步为了防止某个线程独占 CPU 资源,可以让当前执行的线程休息一下,yield()方法可

2021-04-29 09:01:32 97 1

原创 线程讲解(一)

线程说明跟进程比较,线程的特点:线程本身不能单独运行,它必须在一个程序中运行.线程是程序的内部控制流,一个进程在执行过程中,为了同时完成多个操作,可以创建多个线程,形成多条执行线索.每个线程有自己的堆栈、自己的程序设计器和自己的局部变量.每个进程都有一段专用的内存区域.而同一个进程的各线程间可以共享相同的内存空间(代码空间和数据空间),并且利这些共享内存来实现数据交换、实施通信以及必要的同步工作.线程是程序中的一个执行流,一个执行流是由CPU运行程序代码并操作程序的数据形成的.JAVA 中的线

2021-04-28 13:50:08 520 2

原创 策略模式,工厂模式,InitializingBean相结合解决多条件筛选

策略模式,工厂模式,InitializingBean相结合解决多条件筛选编码中面对日益繁多的if else,switch导致代码越来越臃肿,可读性,可维护性也会急剧下降,这里我们先用策略模式去解决:策略模式代码:接口IDemoServicepublic interface IDemoService { String getServiceName(); }实现类Demo1ServiceImpl,Demo2ServiceImpl@Servicepublic class

2021-04-28 13:49:29 240

原创 InitializingBean讲解

InitializingBean讲解Spring中有两种类型的Bean,一种是普通Bean,另一种是工厂Bean,即FactoryBean.工厂Bean跟普通Bean不同,其返回的对象不是指定类的一个实例,其返回的是该工厂Bean的getObject方法所返回的对象.创建出来的对象是否属于单例由isSingleton中的返回决定. 使用场景:1>通过外部对类是否是单例进行控制,该类自己无法感知2>对类的创建之前进行初始化的操作,在afterPropertiesSet()中完成Sp

2021-04-28 13:48:07 2938

原创 RabbitMQ概念

RabbitMQ简介AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计.消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然. AMQP的主要特征是面向消息,队列,路由(包括点对点和发布/订阅),可靠性,安全. RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python,Ruby,.NET,Java,JMS,C,PHP,Action

2021-04-28 13:45:59 83

空空如也

空空如也

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

TA关注的人

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