java 多线程
本专栏主要总结与学习多线程相关知识
venus321
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
ThreadLocal
ThreadLocal引入 ThreadLocal使用 ThreadLocal get第一次返回为null问题 ThreadLocal存取每一个线程共享变量的隔离性 ThreadLocal实现原理 一个线程可以存放多个ThreadLocal对象 ThreadLocal引入 该类主要实现每一个线程都有自己共享变量。该类提供了线程局部变量。这些变量不同于它们的普通对应...原创 2018-04-19 19:53:03 · 206 阅读 · 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 · 833 阅读 · 0 评论 -
生产者消费者模式实现
一对一的生产消费 多生产多消费模式 一生产者和多消费者 生产者和消费者模式,主要就是基于等待/通信模式,在之前我们已经学习wait和notify,下面我们就来实现代码。 一对一的生产消费 public class Test226 { private static String value=""; private static Object...原创 2018-04-01 13:40:04 · 212 阅读 · 0 评论 -
线程通信
不使用等待通信的机制 等待/通知机制理解 等待/通知机制 比较大的坑 wait异常 等待通知实例 wait()锁释放 notify方法 wait(long time) 通知过早 wait条件的改变 补充 线程在操作系统中是独立的个体,为了使独立的线程成为整体,来由程序员哥哥对各线程任务在处理过程中进行有效的把控与监督,让他们彼此之间可以互相通信和协作...原创 2018-03-24 13:59:45 · 202 阅读 · 0 评论 -
CopyOnWriteArrayList
该类是ArrayList 的一个线程安全的变体,其中所有可变操作(插入、删除、修改 等等)都是通过对底层数组进行一次新的复制来实现的。 我们都知道List在多个线程中,如果一方去读,一方去修改,是会报异常的ConcurrentModificationException。而CopyOnWriteArrayList则不会。 Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基...原创 2018-03-09 13:06:05 · 179 阅读 · 0 评论 -
原子变量
java.util.concurrent.atomic介绍 回顾一个操作 问题引出 AtomicInteger 常用方法 悲观锁 乐观锁 CAS (了解一下) 源码分析 CAS 问题(了解) AtomicIntegerArray AtomicReference AtomicIntegerFieldUpdater 原子类并不一定完全安全 java.util....原创 2018-03-08 16:28:26 · 402 阅读 · 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 · 192 阅读 · 0 评论 -
锁对象的改变
在任何数据类型作为同步锁时,需要注意的是,是否有多个线程同时持有锁对象,如果同时持有相同的对象,则这些线程之间就是同步的;如果分别获得锁对象,则这些线程之间就是异步。 package com.example.test; public class Test193 { private String lock ="laoqiang"; public static void main(S...原创 2018-03-02 15:13:45 · 466 阅读 · 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 · 375 阅读 · 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 · 324 阅读 · 0 评论 -
synchronized(this)与synchronized(非this)的区别
synchronized 代码块间的同步性在使用同步synchronized代码块时需要注意的是,当一个线程访问object 的一个 synchronized(this) 同步代码块时,其他线程对同一个object 中所有其他synchronized(this) 同步代码块的访问将被阻塞,这说明synchronized 使用的“对象监视器”是一个。 看例子: public class O...原创 2018-02-19 16:24:25 · 5435 阅读 · 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 · 1289 阅读 · 0 评论 -
发生在线程中异常
首先我们要知道如果两个线程之间是相互独立的,那么如果在一个线程执行过程中,发生异常,另外一个线程是不影响的,会继续执行。 那么,我们就思考,线程中发生了异常,所持有对象锁是如何变化。 public class Test171 { synchronized public void show() { for(int i = 0;i<10;i++) { ...原创 2018-02-08 13:26:42 · 606 阅读 · 0 评论 -
synchronized锁重入
关键字synchronized拥有锁重人的功能,也就是在使用synchronized时,当一个线程得到一个对象锁后,再次请求此对象锁时是可以再次得到该对象的锁的(必须保证该对象锁,还没有释放)。这也证明在一个synchronized 方法/块的内部调用本类的其他synchronized 方法/块时,是永远可以得到锁的。(获得的锁是同一个对象锁,不可能是其他的) public class Test...原创 2018-02-08 11:05:54 · 237 阅读 · 0 评论 -
线程操作-脏读
在之前,我们都知道通过synchoronized关键字来实现对方法的同步。 在线程操作实例变量的情况下,虽然在赋值时进行了同步,但在取值时有可能出现一些意想不到的意外,这种情况就是脏读。发生脏读的情况是在读取实例变量时,此值已经被其他线程更改过。 package com.example.test; public class Account { private String use原创 2018-02-06 16:43:03 · 306 阅读 · 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 · 292 阅读 · 0 评论 -
守护线程
Java线程 用户线程 守护线程 守护线程是一种特殊的线程,当进程中不存在非守护线程了,则守护线程自动销毁。 只要当前JVM实例中存在任何一个非守护线程没有结束,守护线程就在工作,只有当最后一个非守护线程结束时,守护线程才随着JVM一同结束工作。 Daemon的作用是为其他线程的运行提供便利服务,应用GC(垃圾回收器)。 判断线程是不是守护线程 t.isDaemon(); 通过验原创 2018-01-31 13:00:54 · 197 阅读 · 0 评论 -
线程Sleep、Yield、Join
线程优先级 sleep yield 例子 join 例子 joinlong time 线程优先级 记住当线程的优先级没有指定时,所有线程都携带普通优先级。 优先级可以用从1到10的范围指定。10表示最高优先级,1表示最低优先级,5是普通优先级。 记住优先级最高的线程在执行时被给予优先。但是不能保证线程在启动时就进入运行状态。 与在线程池中等待运行机会的线程相比原创 2017-11-30 13:23:37 · 305 阅读 · 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 · 12726 阅读 · 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 · 1342 阅读 · 0 评论 -
interrupted、isInterrupted
对于线程来说,动起来不是什么问题,但是如何让它停下来,就需要一些处理。 虽然stop、suspend、resume都可以使线程停下来,但是官方是不建议的,现在已经废弃了。 interrupt方法仅仅只是打了一个停止标记。 判断线程是否停止状态 interrupt isInterrupted public class Test148 { public static ...原创 2018-01-24 16:23:46 · 301 阅读 · 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 · 1582 阅读 · 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 · 7433 阅读 · 3 评论 -
Object中wait和notify
wait notify waitnotify小例子#### Object 类 Object 是类层次结构的根类。所以这个类中的一些还是要重点了解一下。waitapi解释: 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。将当前线程置入”预执行队列”中,并且wait()所在的代码处停止执行,直到接到通知或被中断异常。在调用wait()之前,线程必须获原创 2017-11-29 15:35:39 · 341 阅读 · 0 评论 -
Executor、Executors、Callable、FutureTask、ExecutorService
Executor execute Executor的实现的子类 Executor 异步同步情况 Executors Callable Future FutureTask ExecutorService 常用方法 基于ExecutorService例子Executor执行已提交的 Runnable 任务的对象。此接口提供一种将任务提交与每个任务将如何运行的机制(包括线程使用的细节、调度等)分离开来的方原创 2017-11-22 14:59:41 · 784 阅读 · 0 评论 -
CountDownLatch、CyclicBarrier和Semaphore的学习
CyclicBarrier 简单示例 await方法 await指定超时时间 CyclicBarrier的重用 CountDownLatch 简单使用 Semaphore 简单例子 总结CyclicBarrier该类是一个同步的辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程(就是线程数的确定)的程序中,这些线程必须不时地原创 2017-11-18 15:21:44 · 345 阅读 · 0 评论
分享