![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
线程
文章平均质量分 68
蜻蜓点水q
欢迎伙伴私聊一起交流共同学习
展开
-
编写代码, 基于 AtomicInteger 实现多线程自增同一个变量
【代码】编写代码, 基于 AtomicInteger 实现多线程自增同一个变量。原创 2023-08-11 19:34:58 · 174 阅读 · 0 评论 -
HashTable, HashMap, ConcurrentHashMap 之间的区别
虽然是线程安全的,但是它只是简单地用修饰了一些关键方法,相当于是对加锁,即对整个对象进行加锁在多线程情况下,这种加锁方式是非常低效的:1) 多个线程访问同一个对象时,无论做什么操作,都会产生锁冲突;2) 如果某个线程触发了扩容机制,那么就会由这个线程完成整个扩容过程,如果元素过多,效率则非常低,其它线程阻塞等待的时间也会更长。原创 2023-08-11 10:30:03 · 75 阅读 · 0 评论 -
总结synchronized
互斥性:synchronized保证了同一时刻只有一个线程可以执行被synchronized修饰的代码块或方法。当一个线程进入synchronized代码块或方法时,其他线程必须等待,直到该线程执行完毕并释放锁。可重入性:同一个线程可以多次获得同一个对象的锁。如果一个线程已经获取了对象的锁,在持有锁的情况下再次进入由synchronized修饰的代码块或方法,不会产生死锁,而是允许继续访问。保证可见性:synchronized不仅保证了线程的互斥执行,还保证了共享变量的可见性。原创 2023-08-10 15:02:27 · 809 阅读 · 0 评论 -
死锁的成因,和解决方案总结
死锁是多线程或并发程序中的一种情况,当多个线程因为竞争资源而相互等待,并且无法继续执行的情况。在死锁中,每个线程都在等待其他线程释放资源,从而导致所有线程都陷入无限等待状态,无法继续向前执行,最终导致程序无法完成任务。原创 2023-08-10 14:44:35 · 278 阅读 · 0 评论 -
总结线程池
核心线程数():核心线程数是线程池中保持活动状态的线程数量。在没有任务执行时,核心线程会一直保持存活状态。如果任务数量超过核心线程数,线程池会创建新的线程来执行任务。最大线程数():最大线程数是线程池中允许存在的最大线程数量。当任务数量超过核心线程数且任务队列已满时,线程池会创建新的线程,直到达到最大线程数。超过最大线程数的任务会根据配置的拒绝策略进行处理。空闲线程存活时间():当线程池中的线程数量超过核心线程数时,多余的空闲线程会在一定时间内保持活动状态,等待新的任务。原创 2023-08-09 16:33:48 · 98 阅读 · 0 评论 -
线程安全问题的原因和解决方案的总结
1.随机调度,抢占式执行(万恶之源,无法解决)2. 多个线程修改同一个变量(可适当调节代码结构,避免这种情况)3.修改操作不是原子性的(加锁,关键字synchronized)4.内存可见性(使用关键字volatile)5.指令重排序(使用关键字synchronized)原创 2023-08-08 15:07:47 · 57 阅读 · 0 评论 -
单例模式写法的总结(保证线程安全)
知道你很饿,但是当你第一次需要的时候我再给你,不需要的时候是没有我的实例对象给你调用的,这个实例对象通常由方法中创建,由方法来返回。可以保证在程序运行过程中,一个类只有一个实例,而且该实例易于供外界访问,从而方便的控制了实例个数,并节约系统资源。会的,如果多个线程中同时调用getSingleton方法,那么就有可能同时创建出多个实例对象。而懒汉模式是需要才创建,那么多个线程中同时需要会怎么办?的过程中创建实例,所以就写在static代码块中,和类一起加载。因为饿汉模式提前创建好了,所以天生就是线程安全的。原创 2023-08-08 14:18:35 · 1180 阅读 · 0 评论 -
总结 Thread 类基本用法
/自定义标识符@OverrideSystem.out.println("开始执行");while(!flag){try {//线程休眠1sSystem.out.println("线程结束");});flag=true;// 自定义中断标识符的问题在于:线程中断的不够及时。// 因为线程在执行过程中,无法调用 while(!isInterrupt) 来判断线程是否为终止状态,// 它只能在下一轮运行时判断是否要终止当前线程,所以它中断线程不够及时。原创 2023-08-07 02:00:23 · 46 阅读 · 0 评论 -
使用两个线程来累加 count 的值
每个线程循环 1w 次,累加变量 count 的值,count 默认值为 0,注意线程安全问题。原创 2023-08-07 17:32:27 · 98 阅读 · 0 评论 -
Thread类中run和start的区别(方法及运行结果)
单独调用run()的话,会在当前线程中执行run(),而并不会启动新线程!(1)Thread.currentThread().getName()是用于获取“当前线程”的名字。(3) mythread.start()会启动“线程mythread”,“线程mythread”启动之后,会调用run()方法;start() : 它的作用是启动一个新线程,新线程会执行相应的run()方法。(2) mythread.run()是在“主线程main”中调用的,此时的run()方法是运行在“线程mythread”上。原创 2023-08-07 01:30:23 · 86 阅读 · 0 评论 -
Java 线程的几种状态解析
从,任何线程一般都具有五种状态,即创建、就绪、运行、阻塞、终止。在程序中用构造方法创建一个新线程时,如new Thread(),该线程就是创建状态,此时它已经有了相应的内存空间和其它资源,但是还没有开始执行。新建线程对象后,调用该线程的start()方法就可以启动线程。当线程启动时,线程就进入就绪状态(runnable)由于还没有分配CPU,线程将进入线程队列排队,等待CPU服务,这表明它已经具备了运行条件。当系统挑选一个等待执行的Thread对象后,它就会从等待状态进入执行状态。原创 2023-08-06 17:32:50 · 82 阅读 · 0 评论 -
进程和线程的区别和联系(总结)
进程是操作系统资源分配的基本单位,线程是处理器(CPU)任务调度和执行的基本单位每个进程都有独立的代码和数据空间(程序的上下文)程序之间的切换会有较大的开销;而同一类线程共享代码和数据空间,每个线程都有自己独立运行的栈和程序计数器(PC),线程之间的切换开销小一个进程有多个线程,执行过程由一个或多个线程共同完成同一个进程的线程共享本进程的地址空间和资源;进程之间的地址空间和资源是相互独立的某进程挂掉,在保护模式下不会对其他进程产生影响;但一个线程奔溃后整个进程都会死掉;多进程比多线程健壮。原创 2023-08-03 17:36:58 · 41 阅读 · 0 评论 -
总结 进程调度的基本过程
一个运行起来的程序就是进程,点开一个软件的.exe可执行文件,这个程序就跑起来就产生了一个进程。我们可以打开任务管理器 - 首页进程,可以看到3个正在使用的应用,还有71个后台进程。对于多进程,需要进行管理。PCB(Process Control Block)是进程控制块,每一个进程均有一个PCB,它随进程的创建而出现,随进程的结束而消失。PCB用于描述进程的当前情况和控制进程运行的全部信息,下面总结PCB的几个核心属性:每个进程的唯一身份标识当前这个进程使用的内存是哪一部分。原创 2023-08-03 09:01:24 · 107 阅读 · 0 评论