java多线程编程
Rookie2Master
CSDN is like shit and is no longer used
展开
-
ThreadLocal原理及使用的时候有什么需要注意的
ThreadLocal是一个关于创建线程局部变量的类。通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。ThreadLocal类允许我们创建只能被同一个线程读写的变量。因此,如果一段代码含有一个ThreadLocal变量的引用,即使两个线程同时执行这段代码,它们也无法访问到对方的ThreadLocal变量(反射可以)。ThreadLocalMap内部是一个Entry数组,Entry继承自WeakReference,Entry内部的key就是ThreadLocal本身,value是ThreadLo原创 2020-12-15 19:58:00 · 1098 阅读 · 2 评论 -
Java多线程编程16 -单例模式与多线程
- 创建单例1. 延迟加载/懒汉模式public class Singleton { //本类内部创建对象实例 private static Singleton instance = null; // 1.构造方法私有化,外部不能new private Singleton() { } //提供一个公有的静态方法,返回实例对象 public static Sing...转载 2020-01-08 17:14:07 · 95 阅读 · 0 评论 -
Java多线程编程15 -Timer定时任务
在java中,定时计划任务功能主要使用的就是Timer对象,主要有如下技术点:实现指定事件执行指定任务实现按照指定周期执行任务定时器TimerTimer类的主要作用是设置计划执行的任务,而封装任务的类是TimerTask类,类声明如下:public abstract class TimerTask implements Runnable{...}可以看到TimerTask是一个抽...原创 2020-01-06 21:38:47 · 153 阅读 · 0 评论 -
Java多线程编程14 -condition&lock
-condition实现生产者/消费者class LockService { private Lock lock = new ReentrantLock(); private Condition condition = lock.newCondition(); private boolean hasProduced = false; void producer() { lock.l...原创 2020-01-06 19:53:34 · 96 阅读 · 0 评论 -
Java多线程编程13 -Condition
Condition的中文翻译是状态. 没错,这个就是让多线程在不同状态切换其他线程执行.跟Object.wait和Object.notify有点类似.Condition.await: 让当前线程一直等到直到获取信号,或者发生中断.通过和lock锁互相配合,会使当前线程一直睡眠直到一下四种情况的其中一种发生:另外一个线程调用当前Condition的signal方法,这当前线程会被挑选出来,...转载 2020-01-05 16:05:55 · 118 阅读 · 0 评论 -
Java多线程编程12 -锁的相关概念
在前面介绍了Lock的基本使用,这一节来介绍一下与锁相关的几个概念。1.可重入锁如果锁具备可重入性,则称作为可重入锁。像synchronized和ReentrantLock都是可重入锁。可重入性在我看来实际上表明了锁的分配机制:基于线程的分配,而不是基于方法调用的分配。举个简单的例子,当一个线程执行到某个synchronized方法时,比如说method1,而在method1中会调用另外一个...转载 2020-01-05 11:11:05 · 107 阅读 · 0 评论 -
Java多线程编程11 -Lock
采用synchronized关键字来实现同步的话,就会导致一个问题:如果多个线程都只是进行读操作,所以当一个线程在进行读操作时,其他线程只能等待无法进行读操作。因此就需要一种机制来使得多个线程都只是进行读操作时,线程之间不会发生冲突,通过Lock就可以办到。另外,通过Lock可以知道线程有没有成功获取到锁。这个是synchronized无法办到的。总结一下,也就是说Lock提供了比sync...转载 2020-01-05 10:53:14 · 147 阅读 · 0 评论 -
Java多线程编程10 -ThreadLocal使用场景及原理
ThreadLocal原理ThreadLocal应用转载 2020-01-03 17:34:44 · 204 阅读 · 0 评论 -
Java多线程编程09 -join方法
在很多情况下,主线程创建并启动子线程,如果子线程中要进行大量的耗时运算,主线程将早于子线程结束。这时,如果主线程想等子线程执行完成才结束,比如子线程处理一个数据,主线程想要获得这个数据中的值,就要用到join()方法了。方法join()的作用是等待线程对象销毁。- join方法介绍join方法的主要作用就是同步,它可以使得线程之间的并行执行变为串行执行在A线程中调用了B线程的join()方法时...转载 2019-12-22 19:40:55 · 118 阅读 · 0 评论 -
Java多线程编程08 -实战等待通知之交叉备份
要求: 创建20个线程(??一共20个线程main不应该是10吗?),十个线程将数据备份到数据库A,十个线程将数据备份到数据库B,且备份A与备份B是交叉进行的。同时还要求有序。// 数据库操作public class DBTools { volatile private boolean prevIsA = false; synchronized public void back...原创 2019-12-22 19:10:28 · 120 阅读 · 0 评论 -
Java多线程编程07 -线程通信wait()¬ify()&生产者消费者模型
线程间通信-等待/通知机制轮询的方法实现 线程间通信,简单的例子就是一个线程死循环查询某个条件是不是满足,非常浪费CPU资源。这里讨论等待/通知机制。在Java语言中,实现等待通知机制主要是用:wait()/notify()方法实现。wait()方法 :wait()方法是使当前执行代码的线程进行等待,wait()方法是Object类的方法,该方法用来将当前线程置入“欲执行队列”(阻塞不是...原创 2019-12-21 21:41:04 · 163 阅读 · 0 评论 -
Java多线程编程06 -volatile&synchronized比较 &可见性&原子性
-volatilevolatile 主要作用是是变量在多个线程间可见。一个同步死循环的问题主要形式例如:main调用一个方法print(),这个方法根据一个boolean 值判断是不是结束循环,但是这个初始的boolean值是true的,也就是会在方法里一直循环,而把这个值置为false的语句在mian里调用print()的下面,也就是说单线程模式下,main执行不到调用print()下面...原创 2019-12-19 21:57:42 · 252 阅读 · 1 评论 -
Java多线程编程 05-静态锁(类锁)&String锁&锁对象改变
-静态锁(类锁)关键字synchronized修饰到静态static方法上,这样的话是给对应的Class类进行加锁。下面考虑以下情况:两个线程内用类名调用静态加锁方法: 同步业务类:Service , Service中两个静态方法加锁: synchronized public static void printA(); synchronized public static ...原创 2019-12-19 17:53:49 · 267 阅读 · 0 评论 -
Java多线程编程04 -锁重入&对象监视器
-锁重入关键字synchronized拥有锁重入的功能,也就是当一个线程获得对象锁之后,再次请求该对象锁(调用这个对象加锁的方法)时可以直接获得锁。也就是说在一个synchronized 方法/块内调用本类的其他synchronized方法/块时永远得到锁。例子:public class SyncReUseService { synchronized public void serv...原创 2019-12-18 22:08:46 · 127 阅读 · 0 评论 -
Java多线程编程03 -对象锁
非线程安全 – 在多个线程对同一对象中的实例变量进行并发访问时产生产生的后果就是脏读,取到的数据被修改过了。线程安全 – 就是获得的值都是同步处理过的。不会出现脏读需要注意的是:非线程安全问题只是存在于“实例变量”(多指类里的属性字段)中,如果访问的数据是一个方法内部的私有变量(临时变量或方法内部声明的变量),那就没有安全问题了。-synchronized 同步方法两个线程同时访问一个同一...原创 2019-12-18 14:57:43 · 110 阅读 · 0 评论 -
java多线程编程02 -暂停线程&yield方法&优先级&守护进程
-暂停线程suspend() 可以暂停线程, resume()恢复线程的执行。suspend() 其实已经是过期作废的方法,极易造成公共的同步对象的独占,使得其他线程无法访问公共的同步对象。独占例子1:在一个类Tee里面,给一个方法上了锁synchronized public void inStr() { ++i; Thread.currentThread().suspen...原创 2019-12-17 17:54:25 · 187 阅读 · 0 评论 -
java多线程编程01 - 基本API&停止线程
- isAlive()判断当前线程是不是处于活动状态(运行态或者就绪态)- getXXgetName(), getId() 取得进程名字和唯一标识。- currentThread()可以返回当前代码段是在被哪个线程执行的信息。注意和 this 进行区别: this执行的是当前的新线程的对象, currentThread()指向的是当前执行的线程对象。 在新线程的构造方法里,调用this...原创 2019-12-17 12:16:33 · 194 阅读 · 2 评论 -
java多线程编程00 -第一个多线程程序
-第一个线程的程序public static void main 这就是一个JVM创建的线程public static void main(String[] args) { // 控制台会输出 "main" 这个字符串 System.out.println(Thread.currentThread().getName());}实现多线程的两种方式:1.继承Thread类 ...原创 2019-12-16 22:27:32 · 133 阅读 · 0 评论