![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java Thread
加油开心
你好呀
展开
-
ThreadLocal
//准备100只笔,每人一只//不至于100个人共用一支笔//SimpleDateFormat的parse方法不是线程安全的//不使用ThreadLocal就会出异常//因为在线程池中共享一个对象必然导致错误import java.util.*;import java.text.*;import java.util.concurrent.*;public class xian{ ...原创 2019-10-13 01:58:47 · 80 阅读 · 0 评论 -
SimpleDateFormat中parse和format的区别
//SimpleDateFormat中的parse方法可以 //把String型的字符串转换成特定格式的date类型 public static void main(String[] args) { String str = "2013-01-21 15:10:20"; Date date = null; SimpleDateF...原创 2019-08-28 23:25:16 · 170 阅读 · 0 评论 -
无锁AtomicInteger类
//无锁//无锁是使用一种叫CAS技术的,使用无锁程序会略微复杂//多个线程同时使用CAS操作一个变量时只有一个会胜出,并成功更新,这和有锁很相似//那些失败的线程不会被挂起,而是会被告知失败,并且允许在此尝试//CAS有三个变量,V,E,N//V表示要更新的变量,E表示预期值,N表示新值//当V和E的值相等时,才会将V设置为N//当V和E的值不等时,不会将V设置为N//无锁使用的...原创 2019-08-28 23:26:22 · 123 阅读 · 0 评论 -
AtomicStampedReference时间戳
//一家商店为了挽留客户决定为贵宾卡里小于20元的用户免费充值20//但是一个用户只能被充值一次//之前我们用AtomicReference//但是这样会出现一个问题:同一个用户会被充值多次//所以这次我们使用AtomicStampedReference解决这个问题////即使对象被反复读写,并写回原值//只要时间戳发生变换,就能防止不恰当写入//import java.uti...原创 2019-08-29 23:26:31 · 210 阅读 · 0 评论 -
AtomicReference
//一家商店为了挽留客户决定为贵宾卡里小于20元的用户免费充值20//但是一个用户只能被充值一次//运行以下程序你会发现用户一旦卡上余额小于20就会被充值20元//这与只充值一次不相符//其原因就是账户余额被反复修改,修改后等于原来的值//使得CAS无法判断当前数据状态//AtomicReference是对对象的引用,而AtomicInteger是对整数的引用import jav...原创 2019-08-29 23:27:10 · 216 阅读 · 0 评论 -
数组的无锁AtomicIntegerArray
//数组的无锁AtomicIntegerArrayimport java.util.concurrent.atomic.*;public class AtomicIntegerArrayDemo{ //10个元素的数组 static AtomicIntegerArray arr = new AtomicIntegerArray(10); public static class AddT...原创 2019-08-29 23:27:44 · 159 阅读 · 0 评论 -
哲学家问题
//哲学家问题//什么是死锁?//比如两个相互占用对方所需的资源,但是都不释放自己的//所以就形成了无限等待的现象//死锁一旦产生没有外力帮助就永远存在,对程序产生严重影响public class DeadLock extends Thread{ protected Object tool; static Object fork1 = new Object(); static Ob...原创 2019-08-29 23:28:15 · 91 阅读 · 0 评论 -
重入锁的condition条件
//Condition和wait与notify很像//前是和重入锁想关联//后者和synchroized相关联//import java.util.concurrent.locks.ReentrantLock;import java.util.concurrent.locks.Condition;public class ReenterLock implements Runnable{...原创 2019-08-01 11:22:52 · 293 阅读 · 0 评论 -
重入锁的lockInterruptibly
//这次我们学锁的中断响应//就是一个锁在等待锁时可以取消对该锁的请求//重入锁本身就是锁//你可能会觉得他没有lock.lock就锁不上了//其实不是这样的import java.util.concurrent.locks.ReentrantLock;public class ReenterLock implements Runnable{ public static Reent...原创 2019-08-01 11:24:23 · 294 阅读 · 0 评论 -
重入锁的tryLock
import java.util.concurrent.locks.ReentrantLock;import java.util.concurrent.TimeUnit;public class ReenterLock implements Runnable{ public static ReentrantLock lock = new ReentrantLock(); @Overrid...原创 2019-08-01 11:25:05 · 215 阅读 · 0 评论 -
重入锁的公平锁
import java.util.concurrent.locks.ReentrantLock;//公平锁//只需加一个true就可以了//但是公平锁根据先来后到//比如两个线程同时请求了一个锁//所以这时只能从等待队列里随机挑一个给锁//公平锁优点是只要你申请了就一定会会的锁,不会饥饿//但是缺点是成本高,性能比非常高public class ReenterLock imple...原创 2019-08-01 11:25:47 · 126 阅读 · 0 评论 -
重入锁基础代码
//ReentrantLock是一个类//里面有很多方法//比如lock,lockInterruptibly,tryLock,tryLock(参数,参数),unlockimport java.util.concurrent.locks.ReentrantLock;public class ReenterLock implements Runnable{ //ReentrantLock中文...原创 2019-08-01 11:26:31 · 185 阅读 · 0 评论 -
扩展线程池
//扩展线程池//ThreadPoolSize是一个可扩展线程池//提供了beforeExecute(),afterExecute(),terminated()三个接口import java.util.concurrent.locks.*;import java.util.concurrent.*;public class ExtThreadPool{ public static cl...原创 2019-08-27 23:26:33 · 165 阅读 · 0 评论 -
SimpleDateFormat类
import java.util.*;import java.text.*;public class xian{ public static void main(String[] args) { Date now = new Date( ); SimpleDateFormat ft = new SimpleDateFormat ("E yyyy.MM.dd 'at' hh...原创 2019-08-28 23:23:23 · 131 阅读 · 0 评论 -
java虚拟机对锁优化的努力
//java虚拟机对锁优化的努力//1.锁偏向//一个获得了锁,那么该锁就进入偏向模式,该线程下次在访问该锁时无需其他操作//但是如果同时大量不同的线程访问该锁时就会处于等待状态,锁偏向失效,////2.轻量级锁//如果锁偏向失效,线程不会立即挂起,系统就会使用轻量级锁,获得轻量级锁的线程还是可以进入临界区//没有获得轻量级锁的线程的锁请求就会膨胀为重量级锁////3.自旋锁/...原创 2019-08-28 23:22:52 · 252 阅读 · 0 评论 -
自定义拒绝策略
//自定义拒绝策略//实现RejectedExecutionHandler接口//接口里的方法void rejectedExecution(Runnable r,ThreadPoolExecutor ExecutorService)import java.util.concurrent.locks.*;import java.util.concurrent.*;public class ...原创 2019-08-27 23:27:57 · 622 阅读 · 0 评论 -
ThreadPoolExecutor
//之前所有方法讲的几个Executor方法的内部实现都是通过ThreadPoolExecutor实现/*public ThreadPoolExecutor(int corePoolSize, //线程池中线程数量 int maximumPoolSize, //线程持中最大线程数量 long ke...原创 2019-08-27 23:28:48 · 136 阅读 · 0 评论 -
线程池基础代码
//线程池//开启一个线程需要资源//但是你如果为每一个小任务都开启一个线程//那么线程的数量就会越来越多//会消耗时间以及占用大量的资源////线程池里存了很多固有线程//创建线程的时候就直接从线程池里获得空闲线程//关闭线程就把线程归还给线程池////一般线程池的写法//ExecutorService a = Executors.不同的线程池种类();//a里面有比如s...原创 2019-08-27 23:30:42 · 86 阅读 · 0 评论 -
LockSupport阻塞
////以下请联系suspend和resume那个文件////LockSupport弥补了resume在suspend之前发生//和wait相比不需要先获得锁,也不会抛出异常////它其实就是一个可以让线程阻塞import java.util.concurrent.locks.LockSupport;public class LockSupportDemo { public s...原创 2019-08-27 23:32:07 · 129 阅读 · 0 评论 -
suspend和resume
suspend:挂起线程resume:继续执行挂起一个线程相当于让这个线程停止执行。但是不会释放任何锁资源,所以其它任何线程想要访问的时候都会因此而受牵连,只有在使用resume操作之后被挂起的线程才继续执行但如果resume在suspend之前,那么程序就一直卡那所以这两个方法被废用了////t1线程先开始,t2后开始//t1先被挂起,所以t2就不能运行了//但是t1又r...原创 2019-08-27 23:32:53 · 879 阅读 · 0 评论 -
倒计时CountDownLatch
//////倒计时器CountDownLatch//类似于火箭发射一样//必须等所有检查工作结束之后才能发射import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.u...原创 2019-08-27 23:33:37 · 154 阅读 · 0 评论 -
信号量
//信号量是对锁的扩展//之前内部锁和重入锁只允许一个临界区被一个线程访问//但是信号量可以运许多个线程访问import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Semaphore;public class SemapD...原创 2019-08-27 23:34:30 · 114 阅读 · 0 评论 -
ReadWriteLock
////读写锁//写数据要求一次只有一个线程写//但是读数据没必要一个线程一个线程的接着读//最好一起读,这样可以增加读效率//当读操作大于写操作,//那么读写锁就可以发挥作用了////不写当中的某两行//时间会大大减少import java.util.concurrent.locks.ReentrantReadWriteLock;import java.util.concu...原创 2019-08-27 23:35:27 · 80 阅读 · 0 评论 -
不安全的HashMap及其改进
//多线程使用HashMap是极为不安全的//这在JDK8之前是这样,使用jps和jstack命令你会发现线程成环现象,有可能造成死锁,从而程序永远不可能结束//jps可以查看当前系统所有java程序的进程//而jstack可以查看给定java进程的内部线程和堆栈//所以在JDK8中采用Collections.synchronizedMap代替HashMap,就解决了上述问题//publ...原创 2019-08-28 23:18:13 · 222 阅读 · 0 评论 -
List线程安全
//List本身是不安全的//使用以下才安全//public static List<Integer> list = Collections.synchronizedList(new ArrayList<Integer>());import java.util.ArrayList;import java.util.*;public class xian{ st...原创 2019-08-28 23:18:50 · 1198 阅读 · 1 评论 -
CopyOnWriteArrayList
//之前我们学过ReadWriteLock读写锁//他有一个缺点就是读取需要锁//而CopyOnWriteArrayList的读取操作不需要锁//所以它比上一个更高级//CopyOnWriteArrayList使用了一种叫写时复制的方法//当有新元素添加到CopyOnWriteArrayList时,先从原有的数组中拷贝一份出来,然后在新的数组做写操作//写完之后,再将原来的数组引用指向...原创 2019-08-28 23:19:31 · 73 阅读 · 0 评论 -
锁优化
//锁的优化//对于单核CPU而言,并行算法的效率一般低于串行算法的效率//锁优化的几点建议//1.减小锁持有时间//public synchronized void creat(){// method1();// method2();// method3()// }//其中method2是一个轻量级方法,但是其余两个都是重量级方法//每一个线程获取该锁之后,其余线程都需...原创 2019-08-28 23:20:04 · 68 阅读 · 0 评论 -
jps命令
java的内置命令jps-q:忽略输出的类名、Jar名以及传递给main方法的参数,只输出pid。-m:输出传递给main方法的参数,如果是内嵌的JVM则输出为null-l:输出应用程序主类的完整包名,或者是应用程序JAR文件的完整路径。-v:输出传给JVM的参数。-V:输出通过标记的文件传递给JVM的参数(.hotspotrc文件,或者是通过参数-XX:Flag...原创 2019-08-28 23:20:45 · 245 阅读 · 0 评论 -
jinfo命令
查看jvm的参数jinfo -flags process_id查看java系统参数jinfo -sysprops process_id虚拟机的这些参数可以通过下面的命令查看:java -XX:+PrintFlagsFinal -version | grep manageable除了通过启动脚本可以设置参数,PrintGC默认是打开的,因此我们只需要打开PrintGCDetails...原创 2019-08-28 23:22:09 · 212 阅读 · 1 评论 -
线程池工厂
//ThreadFactory//线程池中的线程是从ThreadFactory中来//方法是Thread newThread(Runnable r)import java.util.concurrent.locks.*;import java.util.concurrent.*;public class xian{ public static class MyTask implemen...原创 2019-08-27 23:27:12 · 162 阅读 · 0 评论