java 多线程
本专栏主要总结与学习多线程相关知识
venus321
这个作者很懒,什么都没留下…
展开
-
ThreadLocal
ThreadLocal引入ThreadLocal使用ThreadLocal get第一次返回为null问题ThreadLocal存取每一个线程共享变量的隔离性ThreadLocal实现原理一个线程可以存放多个ThreadLocal对象ThreadLocal引入该类主要实现每一个线程都有自己共享变量。该类提供了线程局部变量。这些变量不同于它们的普通对应...原创 2018-04-19 19:53:03 · 175 阅读 · 0 评论 -
wait/notify的应用--交替打印
在之前的文章,我们已经讲过了wait和notify的知识点,今天就通过线程之前协同工作,实现线程之间交替打印。package com.example.test;public class Test235 { private boolean flag =false; private Object lock = new Object(); static Test235 ...原创 2018-04-03 13:28:38 · 796 阅读 · 0 评论 -
生产者消费者模式实现
一对一的生产消费多生产多消费模式一生产者和多消费者生产者和消费者模式,主要就是基于等待/通信模式,在之前我们已经学习wait和notify,下面我们就来实现代码。一对一的生产消费public class Test226 { private static String value=""; private static Object...原创 2018-04-01 13:40:04 · 176 阅读 · 0 评论 -
线程通信
不使用等待通信的机制等待/通知机制理解等待/通知机制比较大的坑wait异常等待通知实例wait()锁释放notify方法wait(long time)通知过早wait条件的改变补充线程在操作系统中是独立的个体,为了使独立的线程成为整体,来由程序员哥哥对各线程任务在处理过程中进行有效的把控与监督,让他们彼此之间可以互相通信和协作...原创 2018-03-24 13:59:45 · 169 阅读 · 0 评论 -
CopyOnWriteArrayList
该类是ArrayList 的一个线程安全的变体,其中所有可变操作(插入、删除、修改 等等)都是通过对底层数组进行一次新的复制来实现的。我们都知道List在多个线程中,如果一方去读,一方去修改,是会报异常的ConcurrentModificationException。而CopyOnWriteArrayList则不会。Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基...原创 2018-03-09 13:06:05 · 153 阅读 · 0 评论 -
原子变量
java.util.concurrent.atomic介绍回顾一个操作问题引出AtomicInteger常用方法悲观锁 乐观锁CAS (了解一下)源码分析CAS 问题(了解)AtomicIntegerArrayAtomicReferenceAtomicIntegerFieldUpdater原子类并不一定完全安全java.util....原创 2018-03-08 16:28:26 · 322 阅读 · 0 评论 -
volatile
volatile关键字的主要作用是保证变量在多个线程间的可见性。package com.example.test;public class Test197Service implements Runnable { private boolean flag =true; public boolean isFlag() { return flag; ...原创 2018-03-08 16:09:39 · 161 阅读 · 0 评论 -
锁对象的改变
在任何数据类型作为同步锁时,需要注意的是,是否有多个线程同时持有锁对象,如果同时持有相同的对象,则这些线程之间就是同步的;如果分别获得锁对象,则这些线程之间就是异步。package com.example.test;public class Test193 { private String lock ="laoqiang"; public static void main(S...原创 2018-03-02 15:13:45 · 437 阅读 · 0 评论 -
形参作为锁
话不多说,先看代码:package com.example.test;public class Test192 { public static void main(String[] args) { Test192 test = new Test192(); inner i =test.new inner(); Thread t1 = ...原创 2018-03-02 13:06:36 · 346 阅读 · 0 评论 -
静态同步synchronized方法与synchronized(class)代码块
关键字synchronized还可以应用在static静态方法,如果是这样写,那是对文件对应的Class类进行持锁。 synchronized public static void show() { System.out.println(Thread.currentThread().getName()); try { Thread....原创 2018-02-20 14:23:17 · 288 阅读 · 0 评论 -
synchronized(this)与synchronized(非this)的区别
synchronized 代码块间的同步性在使用同步synchronized代码块时需要注意的是,当一个线程访问object 的一个 synchronized(this) 同步代码块时,其他线程对同一个object 中所有其他synchronized(this) 同步代码块的访问将被阻塞,这说明synchronized 使用的“对象监视器”是一个。看例子:public class O...原创 2018-02-19 16:24:25 · 5394 阅读 · 9 评论 -
synchronized修饰方法的缺点
public class Test176 { synchronized public void show() { String s1 = "这是处理的任务1"+Thread.currentThread().getName(); String s2 = "这是处理的任务2"+Thread.currentThread().getName(); tr...原创 2018-02-08 17:30:59 · 1248 阅读 · 0 评论 -
发生在线程中异常
首先我们要知道如果两个线程之间是相互独立的,那么如果在一个线程执行过程中,发生异常,另外一个线程是不影响的,会继续执行。那么,我们就思考,线程中发生了异常,所持有对象锁是如何变化。public class Test171 { synchronized public void show() { for(int i = 0;i<10;i++) { ...原创 2018-02-08 13:26:42 · 571 阅读 · 0 评论 -
synchronized锁重入
关键字synchronized拥有锁重人的功能,也就是在使用synchronized时,当一个线程得到一个对象锁后,再次请求此对象锁时是可以再次得到该对象的锁的(必须保证该对象锁,还没有释放)。这也证明在一个synchronized 方法/块的内部调用本类的其他synchronized 方法/块时,是永远可以得到锁的。(获得的锁是同一个对象锁,不可能是其他的)public class Test...原创 2018-02-08 11:05:54 · 196 阅读 · 0 评论 -
线程操作-脏读
在之前,我们都知道通过synchoronized关键字来实现对方法的同步。在线程操作实例变量的情况下,虽然在赋值时进行了同步,但在取值时有可能出现一些意想不到的意外,这种情况就是脏读。发生脏读的情况是在读取实例变量时,此值已经被其他线程更改过。package com.example.test;public class Account { private String use原创 2018-02-06 16:43:03 · 280 阅读 · 0 评论 -
对变量的并发访问
多个线程对同一个对象的变量进行并发访问,产生的结果就是“脏读”。对局部变量的访问package com.example.test;public class Test168 { public static void main(String[] args) { Test168 t = new Test168(); Thread tt = new T原创 2018-01-31 14:26:25 · 260 阅读 · 0 评论 -
守护线程
Java线程用户线程守护线程守护线程是一种特殊的线程,当进程中不存在非守护线程了,则守护线程自动销毁。只要当前JVM实例中存在任何一个非守护线程没有结束,守护线程就在工作,只有当最后一个非守护线程结束时,守护线程才随着JVM一同结束工作。Daemon的作用是为其他线程的运行提供便利服务,应用GC(垃圾回收器)。判断线程是不是守护线程t.isDaemon();通过验原创 2018-01-31 13:00:54 · 173 阅读 · 0 评论 -
线程Sleep、Yield、Join
线程优先级sleepyield例子join例子joinlong time线程优先级记住当线程的优先级没有指定时,所有线程都携带普通优先级。优先级可以用从1到10的范围指定。10表示最高优先级,1表示最低优先级,5是普通优先级。记住优先级最高的线程在执行时被给予优先。但是不能保证线程在启动时就进入运行状态。与在线程池中等待运行机会的线程相比原创 2017-11-30 13:23:37 · 268 阅读 · 0 评论 -
synchronized修饰方法到底锁住的是什么
本文参看http://blog.youkuaiyun.com/shenshibaoma/article/details/53009505我们先给出本文的结论,synchronized修饰方法锁住的是对象的本身,也是this。下面我们通过代码来验证。public class Test164 { public static void main(String[] args) { MyThr原创 2018-01-31 09:53:22 · 12650 阅读 · 14 评论 -
suspend与resume使用
暂停和恢复线程suspend 用于暂停线程 resume 用于恢复线程public class Test161 { public static void main(String[] args) { MyThread1 m = new MyThread1(); Thread t = new Thread(m); t.start(); try {原创 2018-01-27 15:48:27 · 1272 阅读 · 0 评论 -
interrupted、isInterrupted
对于线程来说,动起来不是什么问题,但是如何让它停下来,就需要一些处理。虽然stop、suspend、resume都可以使线程停下来,但是官方是不建议的,现在已经废弃了。interrupt方法仅仅只是打了一个停止标记。判断线程是否停止状态interruptisInterruptedpublic class Test148 { public static ...原创 2018-01-24 16:23:46 · 259 阅读 · 0 评论 -
死磕线程中Thread.currentThread()和this
今天的代码的线程都是基于继承Thread,虽然不太建议使用,但是要使用到this。话不多说,先看代码 public static void main(String[] args) { MyThread33 mm = new MyThread33(); Thread t = new Thread(mm);原创 2018-01-19 12:59:56 · 1535 阅读 · 2 评论 -
线程多次调用start方法,引发的异常
简单的线程使用,大家应该都会使用,下面的这个问题,不知道大家有没有注意过。public class Test146 { public static void main(String[] args) { MyThread11 m = new MyThread11(); for(int i = 0;i<5;i++) { m....原创 2018-01-16 10:16:47 · 7373 阅读 · 3 评论 -
Object中wait和notify
waitnotifywaitnotify小例子#### Object 类 Object 是类层次结构的根类。所以这个类中的一些还是要重点了解一下。waitapi解释: 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。将当前线程置入”预执行队列”中,并且wait()所在的代码处停止执行,直到接到通知或被中断异常。在调用wait()之前,线程必须获原创 2017-11-29 15:35:39 · 304 阅读 · 0 评论 -
Executor、Executors、Callable、FutureTask、ExecutorService
ExecutorexecuteExecutor的实现的子类Executor 异步同步情况ExecutorsCallableFutureFutureTaskExecutorService常用方法基于ExecutorService例子Executor执行已提交的 Runnable 任务的对象。此接口提供一种将任务提交与每个任务将如何运行的机制(包括线程使用的细节、调度等)分离开来的方原创 2017-11-22 14:59:41 · 728 阅读 · 0 评论 -
CountDownLatch、CyclicBarrier和Semaphore的学习
CyclicBarrier简单示例await方法await指定超时时间CyclicBarrier的重用CountDownLatch简单使用Semaphore简单例子总结CyclicBarrier该类是一个同步的辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程(就是线程数的确定)的程序中,这些线程必须不时地原创 2017-11-18 15:21:44 · 310 阅读 · 0 评论