java并发编程
快乐狗头
专业斗图20年!
展开
-
JAVA多线程和并发基础问答
Java多线程问题1. 进程和线程之间有什么不同?进程:一个独立的运行环境,可看作一个程序或者一个应用。线程:在进程中执行的一个任务。线程可以被称为轻量级进程。线程需要较少的资源来创建和驻留在进程中,并且可以共享进程中的资源。2. 多线程编程的好处是什么?多线程并发执行以提高程序的效率,提高CPU使用率,节省空间。由于多个线程共享堆内存(heap memory),因此创建多个线程去执行一些任务会比创建多个进程更好。3. 用户线程和守护线程有什么区别?用户线程:我们在Java程原创 2020-07-30 16:09:42 · 203 阅读 · 0 评论 -
Java并发编程:线程间协作
在前面讲了很多关于同步的问题,现在讲线程之间的协作。经典的生产者-消费者模型:当队列满时,生产者等待队列有空间才能继续往里面放入商品,在等待的期间,生产者必须释放对临界资源(即队列)的占用权。因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队列中的商品,生产者就会一直无限等待下去。因此,一般情况下,当队列满时,会让生产者交出对临界资源的占用权,并进入挂起状态。然后等待消费者消费了商品,然后消费者通知生产者队列有空间了。同样地,当队列空时,消费者也必须等待,等待生产者通知它队列中有商品了。这种原创 2020-07-29 14:34:28 · 188 阅读 · 0 评论 -
Java并发编程:Timer和TimerTask
Timer是一个调度器,TimerTask是调度器中的任务。例如:Timer timer = new Timer();timer.schedule(new TimerTask() { public void run() { System.out.println("abc"); }}, 20000 , 1000);20s后开始执行,每秒执行一次。1.常用方法publicvoidschedule(TimerTask task,..原创 2020-07-29 11:04:21 · 186 阅读 · 0 评论 -
Java并发编程:获取线程执行结果
创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。这2种方式都有一个缺陷:在执行完任务之后无法获取执行结果。如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。Java中提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果。一.Callable与RunnableRunnable,是一个接口,只声明了一个run()方法,返回void类型。Callable,是一个接口,只声明了一原创 2020-07-28 16:04:55 · 672 阅读 · 0 评论 -
Java并发编程:辅助类
一.CountDownLatch用法实现类似计数器的功能。CountDownLatch类只提供了一个构造器:public CountDownLatch(int count) { }; //参数count为计数值主要的方法:public void await() throws InterruptedException { }; //调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行public boolean await(long timeout,原创 2020-07-28 15:19:43 · 137 阅读 · 0 评论 -
Java并发编程:线程池
如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。所以,在Java中可以通过线程池:使得线程可以复用,就是执行完一个任务,并不被销毁,而是继续执行其他的任务。一.ThreadPoolExecutor类线程池中最核心的一个类。在ThreadPoolExecutor类中提供了四个构造方法:public class ThreadPoolExecutor extends AbstractExecutorS原创 2020-07-28 13:15:15 · 92 阅读 · 0 评论 -
Java并发编程:阻塞队列
另外一类容器:阻塞队列。非阻塞队列,比如PriorityQueue、LinkedList(LinkedList是双向链表,它实现了Dequeue接口)一.几种主要的阻塞队列在java.util.concurrent包下提供了若干个阻塞队列,主要有以下几个: ArrayBlockingQueue:基于数组实现的一个阻塞队列,在创建ArrayBlockingQueue对象时必须制定容量大小。并且可以指定公平性与非公平性,默认情况下为非公平的,即不保证等待时间最长的队列最优先能够访问队列。(有界原创 2020-07-27 17:36:59 · 113 阅读 · 0 评论 -
Java并发编程:并发容器
始针对多线程并发访问,提供了并发性能较好的并发容器,引入了java.util.concurrent包。与Vector和Hashtable、Collections.synchronizedXxx()同步容器等相比,concurrent中引入的并发容器主要解决了两个问题:1)根据具体场景进行设计,尽量避免synchronized,提供并发性。2)定义了一些并发安全的复合操作,并且保证并发环境下的迭代操作不会出错。面是对并发容器的简单介绍: ConcurrentHashMap代替同步的Map(原创 2020-07-27 16:01:38 · 87 阅读 · 0 评论 -
Java并发编程:同步容器
在Java的集合容器框架中,主要有四大类别:List、Set、Queue、Map。在Java中,同步容器主要包括2类: 1)Vector、Stack、HashTable Vector实现了List接口,Vector实际上就是一个数组,和ArrayList类似,但是Vector中的方法都是synchronized方法,即进行了同步措施。 Stack也是一个同步容器,它的方法也用synchronized进行了同步,它实际上是继承于Vector类。 HashTable实现了...原创 2020-07-27 15:19:43 · 154 阅读 · 0 评论 -
Java并发编程:深入剖析ThreadLocal
ThreadLocal,线程本地变量,或者线程本地存储。ThreadLocal为变量在每个线程中都创建了一个副本,每个线程可以访问自己内部的副本变量。ThreadLocal是如何为每个线程创建变量的副本的: 首先,在每个线程Thread内部有一个ThreadLocal.ThreadLocalMap类型的成员变量threadLocals,这个threadLocals就是用来存储实际的变量副本的,键值为当前ThreadLocal变量,value为变量副本(即T类型的变量)。 初始时,在Threa原创 2020-07-27 14:46:27 · 137 阅读 · 0 评论 -
Java并发编程:volatile关键字解析
1.内存模型当程序在运行过程中,会将运算需要的数据从主存(物理内存)复制一份到CPU的高速缓存当中,CPU进行计算时直接从它的高速缓存读取数据或写入数据,当运算结束之后,再将高速缓存中的数据刷新到主存当中。例子: i = i +1; 当线程执行这个语句时,会先从主存当中读取i的值,然后复制一份到高速缓存当中,然后CPU执行指令对i进行加1操作,然后将数据写入高速缓存,最后将高速缓存中i最新的值刷新到主存当中在Java虚拟机规范中试图定义一种Java内存模型(Java..原创 2020-07-23 16:57:19 · 125 阅读 · 0 评论 -
java并发编程:创建线程和进程
进程让操作系统的并发性成为可能,而线程让进程的内部并发成为可能。一. 创建线程java中如果要创建线程的话,一般有两种方式:1)继承Thread类;2)实现Runnable接口。1.继承Thread类 继承Thread类的话,必须重写run方法,在run方法中定义需要执行的任务。创建线程类:class MyThread extends Thread原创 2016-09-14 15:36:56 · 558 阅读 · 0 评论 -
java并发编程:线程安全-线程同步-synchronized和lock
多线程在提高效率的同时,必然面临线程安全的问题,Java中提供了一些机制来解决线程安全问题。当多个线程同时访问临界资源(或叫共享资源)(一个对象,对象中的属性,一个文件,一个数据库等)时,就可能会产生线程安全问题。不过,当多个线程执行一个方法,方法内部的局部变量并不是临界资源,因为方法是在栈上执行的,而Java栈是线程私有的,因此不会产生线程安全问题。解决方案:序列化访问临界资原创 2016-09-14 18:16:42 · 1502 阅读 · 0 评论