自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(30)
  • 资源 (2)
  • 收藏
  • 关注

原创 并发学习29--多线程 JUC之AQS

try {}finally {},"锁测试1").start();try {}finally {},"锁测试2").start();//不可重入锁,同一个线程再次上锁时,不会成功,除非先开锁log.debug("重入锁....");try {}finally {},"重入锁测试").start();//自定义锁,不可重入锁//独占锁 同步器类//state==0;无锁状态;state==1;有锁状态@Override //获取锁。

2024-04-18 16:43:24 146

原创 并发学习28--多线程 Fork、Join线程池

设置start和end为动态参数。

2024-04-15 18:26:03 188

原创 并发学习27--多线程 Tomcat 线程池

Executor处理线程是按照JDK线程池方法处理,优先选用核心线程,再用救急线程,再去阻塞队列,最后采用拒绝策略。改变了队列和救急线程的先后顺序,此时的救急线程是先于队列的。当提交任务<核心线程-->加入队列中让核心线程来执行任务。socketProcessor也是个线程。

2024-04-12 10:58:48 468

原创 并发学习26--多线程 异步模式之工作线程

让有限的工作线程(Worker Thread)来轮流异步处理无限多的任务。线程池便是这种模式。

2024-04-08 14:32:02 441

原创 并发学习25--多线程 ThreadPoolExecutor

/使用ThreadFactory自定义线程名@Override});});});});//result: 且程序不会结束,因为核心线程只是执行完任务,但并没有结束若每个任务执行时间都很长的话会创建太多线程,消耗CPU影响性能。指t1线程在Queue里放任务时放不进去,只能阻塞在外面,当t2线程来取的时候,就可以把任务取走了。意味着:该队列就是为了阻塞一个任务且不用拒绝策略,只等待线程来执行。

2024-03-27 16:57:55 887

原创 并发学习24--多线程 自定义线程池

/生产者生成任务交给线程池,创建线程执行,如果线程池已满,没有可用的线程,就把任务放入阻塞队列里i<5;});//任务一般抽象成Runnable类型//线程集合--hashSet是线程安全的;不直接引用Thread是因为它里面内容有限//线程池大小--核心线程数//线程获取任务的超时时间//时间类型//执行一个任务//保护共享变量//如果任务数(已存在线程数)小于CoreSize,创建新的线程执行任务。

2024-03-25 17:35:50 225

原创 并发学习23--多线程 共享模型之不可变

i<5;//1.设置连接池大小//2.连接兑对象数组//3.连接数组状态 0表示空闲, 1表示繁忙//4.创建构造方法i<poolSize;i++) {connections[i] = new MockConnect("连接:"+(i+1)+"");//5.借出连接i<poolSize;i++) {//有空闲连接//防止线程不安全,所以不能使用set();//没有空闲连接,就开始等待try {

2024-03-19 16:29:30 190

原创 并发学习22--多线程之Unsafe

属于底层逻辑代码,其中 LockSupport的park,unpark都是基于unsafe实现的。

2024-03-15 14:14:38 195

原创 并发学习21--原子累加器 LongAdder原理

Transient--序列化时,不会把信息序列化;volatile保证可见性类似cas锁,作为j加锁的标记,0表示未加锁,1表示加锁。保护对某些资源访问时的线程安全。保护cell数组在不同线程上创建和扩容时的线程安全。用while true进行保护。累加单元类。

2024-03-14 14:16:25 339

原创 并发学习20--多线程之JUC.Atomic

性能提升原因:在有竞争的时候设置多个原子累加单元,给多个共享变量上累加,Thread0给cell[0](累加单元)上累加,Thread给cell[1]上累加...最后将结果汇总。这样在操作不同的共享变量就减少了CAS重试失败。这时只是比较a与b的值是否一样,但并不判断a的值是否被其他线程在中间做了修改,由a->c->a;是AtomicStampedReference的简化版,只记录引用变量是否被改变,不记录改变的次数。由于主线程运行的A 当时stamp和期望的不同,所以断定A被改变过了,所以设置失败。

2024-03-11 17:20:10 301

原创 并发学习19--多线程之无锁--CAS与Volatile

是指Atomic类中的a.compareAndSet(b,c). 虽然有比较和设置两个操作,但是这个整体是原子性操作。a与b比较,如果相同则进入条件判断内,并将c值赋给a。如果不同则重新操作,a仍然是a的值。Volatile只能实现可见性,但不能解决指令交错的问题(原子性)。CAS的执行需要额外的CPU辅助,所以一般会执行在多核CPU内,并且在线程数少于CPU核数时是占有比较大的优势的。虽然说了CAS是乐观锁,但是它是无锁的,乐观锁只是为了和synchronized悲观锁区分。

2024-03-05 11:20:24 157

原创 并发学习18--线程安全之单例

问题2:在调用getInstance时才会加载LazyHolder类,由JVM创建INSTANCE对象,所以是线程安全的。问题4:不会, 枚举类已经实现序列化,并且反序列化的时候自己已经优化了,是不会破坏单例。问题2:该单例是静态成员变量,在初始化类的时候创建该单例,由JVM控制所以没有并发问题。问题3:构造方法私有是防止其他类创建该类对象,破坏单例。LazyHolder属于静态内部类,类加载总是懒汉式的,只有在用到时才会加载。问题1:懒汉式,用到LazyHolder类时才会加载对象。

2024-03-04 15:32:43 287

原创 并发学习17--Double checked locking 问题

由于code重排序问题导致的错误该语句能够将创建的Singleto对象赋值给INSTANCE,也能实现Singleton的构造方法。若在t1线程已经将值赋给INSTANCE,但没有实现构造方法,这时t2线程拿到没有构造方法的对象INSTANCE,并执行后面的逻辑代码时,可能会出现错误。------这就是由于指令中排序导致的问题。因为INSTANCE不完全在synchronized的保护内。

2024-03-01 16:04:42 217

原创 并发学习16--多线程共享模型之内存&Volatile

但是由于Thread线程不停的从主存中读取run值,所以JIT编译器将run缓存至Thread工作内存的高速缓存中。因此后面改变主存中的run不能中断线程,因为没有改变缓存中的run.Volatile可以保证可见性却不能保证原子性,可在一个线程写,多个线程读的情况下用。写时只保证写屏障前的一条指令与写屏障指令的顺序,如果num = 2前还有其他指令,那么这些指令的顺序和num = 2 的顺序不被保证。当一个线程发现其他线程或者是本线程已经做了某一件相同的事,那么本线程或者其他线程无需再做直接返回。

2024-02-29 15:41:00 795

原创 并发学习15--多线程基本使用总结

分析多线程访问共享资源时,哪些代码属于临界区。 使用Synchronized互斥解决临界区的线程安全问题 掌握Synchronized锁对象语法 掌握Synchronized加载成员方法(锁的是this对象)和静态方法(锁的是Class类对象)语法 public Synchronized void test() {}--->Synchronized(this) {} public static Synchronized void test() {} --->Synchro

2024-02-22 14:57:46 202

原创 并发学习14--多线程同步模式-顺序控制

交替输出abcabcabcabcabc。

2024-02-22 14:31:32 158

原创 并发学习13--多线程ReentrantLock

1.可中断2.可设置超时时间:超过设置时间就取消竞争资源3.可设置为公平锁:先进先出,先等待的优先获得锁4.支持多个条件变量。

2024-02-21 14:37:15 259

原创 并发学习12--多线程死锁

T线程持有A锁,想要B锁;U线程持有B锁,想要A锁,此时成为死锁,都Blocked住。两个线程互相改变对方的线程结束条件,导致两个线程都结束不了,造成活锁现象。使两个线程的执行时间有一定的交错,使其都有充分时间执行结束。2.使用Jstack 进程ID 查看进程里所有的线程。使用Jstack命令或Jconsole界面工具。1.使用jsp获取所有的Java进程ID。

2024-02-18 18:02:12 179

原创 并发学习11--多线程多把锁

如果两个线程互不相干,则可以设置多把锁。

2024-02-18 11:59:11 195

原创 并发学习10--多线程park & unpark+

线程调用LockSupport.unpark(目标线程)/interrupt()/等待超时,会让目标线程从Timed_Waiting-->Runnable。Waiting-->Runnable:获得锁的Thread调用notify()/notifyAll()/intterupt()方法。Waiting-->Blocked:获得锁的Thread调用notify()/notifyAll()/intterupt()方法。2.notify是随机唤醒某个线程,notifyAll是唤醒所有线程。

2024-02-18 11:11:36 993

原创 并发学习09--多线程异步模式之生产者/消费者(wait)

生产者负责生产信息放入消息队列中,消费者从队列中获取消息。队列大小是有限制的(满时不生产消息,空时不取消息)。该模式与保护性暂停模式不同,不需要线程一一对应。(线程中的阻塞队列就是采用这种模式)MessageQueue作为解耦类。

2024-02-02 14:56:05 160

原创 并发学习08--多线程同步模式之保护性暂停(wait暂停)

4.将t2产生的结果放入GuardedObject的response中。t1从GuardedObject的response中拿到t2的值。t0,t2,t4从GuardedObject1.2.3中拿到结果。1.t1线程需要等待t2线程的结果,让t1和t2关联同一个GuardedObject。2.如果有结果不断的从t2到t1,那么可以使用消息队列(生产者 消费者)5.在t2产生结果的过程中t1需要用wait()来等待。: 用于一个线程等待另一个线程的执行结果。

2024-02-01 17:51:58 219

原创 并发学习06--多线程Synchronized底层实现

当对象的锁变成重量级锁后,轻量级解锁就会失败,因为Thread-0的锁记录根据对象的指针找对象时,锁的模式发生改变。之前的线程仍是轻量级锁。多个线程去锁同一个对象,该对象在第一个线程中是偏向锁,在第二个线程就是轻量级锁。)当一个对象已经有轻量级锁(00)了,另一个线程也来访问该对象,想要给该对象加轻量级锁,这时就加锁失败,需要锁膨胀流程,将轻量级锁变为重量级锁(重量级锁有阻塞的概念)。当加锁前,该对象初始是偏向锁(101),加锁中时轻量级锁(00)(撤销重偏向),解锁后时是normal状态(01);

2024-02-01 13:43:47 584

原创 并发学习07--多线程wait/notify

让获得锁的线程(Owner)去WaitSet等待time ms,如果等待期间没有被唤醒,时间结束后自动唤醒,获得cpu时间片后再去运行后面的code。如果等待期间被唤醒,停止等待,运行后面的codes.4.sleep是Thread的静态方法,wait是对象的方法。2.sleep等待时不会释放锁,wait等待会释放锁。: 唤醒WaitSet中的所有线程到EntryList里。: 让获得锁的线程(Owner)去WaitSet等待.WaitSet和EntryList是不同的。

2024-02-01 12:35:07 203

原创 并发学习05--多线程安全判断

单个方法使用是线程安全的,但是其组合不一定是线程安全的。5.String里的split,substring都是拷贝了一个新副本存储新的值,并不是对原有的值进行改变。为不可变类线程安全--因为其内部方法都不可改变。4.注意方法的重写导致线程不安全,可以将方法或类设置为private或者final增强安全性,使其不被暴漏出去。HashTable里的put()方法是有synchronized关键字,所以是安全的。1.线程安全: 多个线程调用同一个实例的方法或变量时,是线程安全的。3.成员变量一般是不安全的。

2024-01-29 16:28:38 198

原创 并发学习04--多线程的共享资源

若Thread1在执行synchronized块时,时间片用完,那么它就退出synchronized块,处于就绪状态(这时共享资源仍被锁着),与thread2一起竞争时间片。当时间片分给thread2时,thread2没有synchronized的钥匙,不能继续执行,所以又处于block状态;当一个线程执行到该关键字时,若其他线程也要访问该共享资源,那么其他线程进入Block状态。a方法锁的是类对象,b方法锁的是this对象,所以锁的是不同的对象;因此他们之间没有互斥关系,两个线程可以并行执行。

2024-01-29 10:59:27 338

原创 并发学习02--多线程使用

4.调用start()方法实际上是调用了Runnable的run()方法;如果直接用Thread调用run()方法,则不走创建的线程,而走主线程;实现了RunnableFuture接口;RunnableFuture接口继承了Runnable接口和Future接口;--->new Thread(Runnable runnable).start()方法启动。---->new Thread(f).start()方法启动;--->直接使用start()方法启动;实现了Runnable接口;

2024-01-25 18:42:41 333

原创 并发学习03--多线程的方法们

其中线程为了获取IO资源在阻塞队列时,也是Runnable状态, sleep()是Timed_waiting, join()是waiting;如果interrupt()打断的是线程的sleep(), wait(), join()方法时,不会给t1线程赋予一个打断标记;其他线程可以使用interrupt()方法,打断正在睡眠的线程并唤醒线程。如果其他线程都运行结束了,但守护线程还没运行完,这时守护线程被强制结束,程序完毕。4.join(): 会阻塞当前线程,并等待调用该方法的线程执行完毕;

2024-01-25 18:41:07 321

原创 并发学习01--并行和并发的概念

----需要了解基准测试工具(JMH)log.Debug("This is a debug log.");//log的调用不需要等filereader执行完毕-->异步。//log的调用需要等filereader执行完毕-->同步。:同一时间做多件事情(微观上串行执行,单核依次执行):例如两核执行3个线程。:同一时刻做多件事情(多核同时执行):不需要等待方法的返回结果;:需要等待方法的返回结果;:一个进程中的执行任务。

2024-01-24 10:31:52 341

原创 Mysql免安装版安装

很多新朋友刚开始用Mysql的时候不会安装,觉得很麻烦,现在根据这些步骤来做(亲测有用)1.前期准备:去官网下载mysql免安装版   https://www.mysql.com/downloads/2.配置环境:下载好mysql后就要开始环境配置(MYSQL_HOME和path)       MYSQL_HOME:

2017-05-23 16:37:48 253

mysql-connector-java-5.1.30

MySQL官方提供的驱动包 mysql-connector-java-5.1.30.zip

2017-09-28

空空如也

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

TA关注的人

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