Java并发

Java并发

AQS的理解和总结

1.概述本来想总结一篇关于Reentra

2020-04-23
92 1

synchronized关键字的初步理解

1.概述我们知道在并发编程中最为重要的就是线程安全问题,而

2020-04-03
70 1

线程池的总结和理解

1.为什么要使用线程池其实这个问题和数据库连接池、字符串常

2020-04-02
76 0

Java创建线程的四种方式

1.继承Thread类(1)继承Thread类并重写run方法(2)创建线程对象(3)调用该线程对象的start()方法来启动线程publicclassCreateThreadTest{publicstaticvoidmain(String[]args){newThreadTest().start();newThreadTest().start();}}classThreadTestextendsThread{privateinti=0;@Overridepublicvoidrun(){for(;i<100;i++){System.out.println(Thread.currentThread().getName()+"isrunning:"+i);}}}2.实现Runnable接口

2020-03-31
59 0

Java阻塞队列理解

这篇内容都是基于自己的一些理解和总结,由于个人能力有限,可能会存在偏差之处,如有发现,欢迎指正!1.概述阻塞队列是一种队列,主要还是在多线程情况下使用,主要的应用场景是生产者消费者模型、线程池和消息中间件中,因为今天刚学习了线程池的知识,所以对阻塞队列的应用很有感触,在创建线程池的构造方法的七大参数里面,其中一项就是阻塞队列:publicThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,longkeepAliveTime,TimeUnitunit,BlockingQueue<Runnable>workQueue,ThreadFactorythreadFactory,RejectedExecutionHandlerhandler)当提交的任务不

2020-03-30
63 0

Java中sleep()和wait()的区别

之前就看过很多次这个问题,今天在写生产者消费者模式中看到了这个方法,这里就做一下总结每个对象都有一个锁用来控制同步访问,synchronized关键字可以使用对象的锁来进行方法和代码块的同步,sleep()方法可以让正在执行的线程主动放弃CPU,在睡眠指定时间之后,CPU再回到这个线程继续执行,注意这个过程只是放弃CPU,并不会释放当前线程占用的对象资源锁。wait()方法则是让当前线程放弃目前占有的对象资源锁,以便让其他等待该资源的线程得到该资源而运行,当前线程自己进入阻塞状态,只有调用了notify()方法才能将当前线程解除阻塞状态,进入就绪状态,重新参与线程调度sleep()方法可以在任何地方使用,wait()方法只能在同步方法和同步代码块中使用sleep()是Thread类的方法,而wait()是Obj

2020-03-29
54 0

为什么ArrayList是线程不安全的

1.概述ArrayList除了需要掌握基本的api调用,还要熟悉他是线程不安全的,下面从源码的角度探索2.源码分析publicclassArrayList<E>extendsAbstractList<E>implementsList<E>,RandomAccess,Cloneable,java.io.Serializable{/***列表元素集合数组*如果新建ArrayList对象时没有指定大小,那么会将DEFAULTCAPACITY_EMPTY_ELEMENTDATA赋值给elementData,*并在第一次添加元素时,将列表容量设置为DEFAULT_CAPACITY*/transientObject[]elementData;/***列表大小,elementData中存储的元素个数*/privateintsize;}所以通过这两个字段我们可以看出,A

2020-03-13
58 0

CAS的理解.md

1.概述CAS,英文全称为CompareAndSet,Java并发中存在乐观锁和悲观锁,而CAS就是乐观锁的一种**实现过程:**我们都知道Java内存模型规定了主内存和工作内存,每个线程都在自己的工作内存中进行数据的修改,并最终写回到主内存中,那么多个线程同时修改主内存的数据时,如何保证线程安全性呢?我们以往的做法是使用锁,一般使用synchronized关键字,这也是一种悲观锁,那么作为乐观锁的一种,CAS是怎样保证线程安全的呢?我们来看下面的代码:publicclassCASDemo{publicstaticvoidmain(String[]args){AtomicIntegeratomicInteger=newAtomicInteger(5);//获取真实值,并替换为相应的值booleanb=atomicInteger.compareAndSet(5,2019);System.ou

2020-03-13
103 0