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 · 82 阅读 · 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 · 173 阅读 · 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 · 125 阅读 · 0 评论 -
AtomicStampedReference时间戳
//一家商店为了挽留客户决定为贵宾卡里小于20元的用户免费充值20 //但是一个用户只能被充值一次 //之前我们用AtomicReference //但是这样会出现一个问题:同一个用户会被充值多次 //所以这次我们使用AtomicStampedReference解决这个问题 // //即使对象被反复读写,并写回原值 //只要时间戳发生变换,就能防止不恰当写入 // import java.uti...原创 2019-08-29 23:26:31 · 211 阅读 · 0 评论 -
AtomicReference
//一家商店为了挽留客户决定为贵宾卡里小于20元的用户免费充值20 //但是一个用户只能被充值一次 //运行以下程序你会发现用户一旦卡上余额小于20就会被充值20元 //这与只充值一次不相符 //其原因就是账户余额被反复修改,修改后等于原来的值 //使得CAS无法判断当前数据状态 //AtomicReference是对对象的引用,而AtomicInteger是对整数的引用 import jav...原创 2019-08-29 23:27:10 · 221 阅读 · 0 评论 -
数组的无锁AtomicIntegerArray
//数组的无锁AtomicIntegerArray import java.util.concurrent.atomic.*; public class AtomicIntegerArrayDemo{ //10个元素的数组 static AtomicIntegerArray arr = new AtomicIntegerArray(10); public static class AddT...原创 2019-08-29 23:27:44 · 162 阅读 · 0 评论 -
哲学家问题
//哲学家问题 //什么是死锁? //比如两个相互占用对方所需的资源,但是都不释放自己的 //所以就形成了无限等待的现象 //死锁一旦产生没有外力帮助就永远存在,对程序产生严重影响 public class DeadLock extends Thread{ protected Object tool; static Object fork1 = new Object(); static Ob...原创 2019-08-29 23:28:15 · 95 阅读 · 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 · 297 阅读 · 0 评论 -
重入锁的lockInterruptibly
//这次我们学锁的中断响应 //就是一个锁在等待锁时可以取消对该锁的请求 //重入锁本身就是锁 //你可能会觉得他没有lock.lock就锁不上了 //其实不是这样的 import java.util.concurrent.locks.ReentrantLock; public class ReenterLock implements Runnable{ public static Reent...原创 2019-08-01 11:24:23 · 298 阅读 · 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 · 219 阅读 · 0 评论 -
重入锁的公平锁
import java.util.concurrent.locks.ReentrantLock; //公平锁 //只需加一个true就可以了 //但是公平锁根据先来后到 //比如两个线程同时请求了一个锁 //所以这时只能从等待队列里随机挑一个给锁 //公平锁优点是只要你申请了就一定会会的锁,不会饥饿 //但是缺点是成本高,性能比非常高 public class ReenterLock imple...原创 2019-08-01 11:25:47 · 129 阅读 · 0 评论 -
重入锁基础代码
//ReentrantLock是一个类 //里面有很多方法 //比如lock,lockInterruptibly,tryLock,tryLock(参数,参数),unlock import java.util.concurrent.locks.ReentrantLock; public class ReenterLock implements Runnable{ //ReentrantLock中文...原创 2019-08-01 11:26:31 · 187 阅读 · 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 · 170 阅读 · 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 · 134 阅读 · 0 评论 -
java虚拟机对锁优化的努力
//java虚拟机对锁优化的努力 //1.锁偏向 //一个获得了锁,那么该锁就进入偏向模式,该线程下次在访问该锁时无需其他操作 //但是如果同时大量不同的线程访问该锁时就会处于等待状态,锁偏向失效, // //2.轻量级锁 //如果锁偏向失效,线程不会立即挂起,系统就会使用轻量级锁,获得轻量级锁的线程还是可以进入临界区 //没有获得轻量级锁的线程的锁请求就会膨胀为重量级锁 // //3.自旋锁 /...原创 2019-08-28 23:22:52 · 256 阅读 · 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 · 629 阅读 · 0 评论 -
ThreadPoolExecutor
//之前所有方法讲的几个Executor方法的内部实现都是通过ThreadPoolExecutor实现 /*public ThreadPoolExecutor(int corePoolSize, //线程池中线程数量 int maximumPoolSize, //线程持中最大线程数量 long ke...原创 2019-08-27 23:28:48 · 142 阅读 · 0 评论 -
线程池基础代码
//线程池 //开启一个线程需要资源 //但是你如果为每一个小任务都开启一个线程 //那么线程的数量就会越来越多 //会消耗时间以及占用大量的资源 // //线程池里存了很多固有线程 //创建线程的时候就直接从线程池里获得空闲线程 //关闭线程就把线程归还给线程池 // //一般线程池的写法 //ExecutorService a = Executors.不同的线程池种类(); //a里面有比如s...原创 2019-08-27 23:30:42 · 91 阅读 · 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 · 132 阅读 · 0 评论 -
suspend和resume
suspend:挂起线程 resume:继续执行 挂起一个线程相当于让这个线程停止执行。但是不会释放任何锁资源,所以其它任何线程想要访问的时候都会因此而受牵连,只有在使用resume操作之后被挂起的线程才继续执行 但如果resume在suspend之前,那么程序就一直卡那 所以这两个方法被废用了 // //t1线程先开始,t2后开始 //t1先被挂起,所以t2就不能运行了 //但是t1又r...原创 2019-08-27 23:32:53 · 895 阅读 · 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 · 156 阅读 · 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 · 115 阅读 · 0 评论 -
ReadWriteLock
// //读写锁 //写数据要求一次只有一个线程写 //但是读数据没必要一个线程一个线程的接着读 //最好一起读,这样可以增加读效率 //当读操作大于写操作, //那么读写锁就可以发挥作用了 // //不写当中的某两行 //时间会大大减少 import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.concu...原创 2019-08-27 23:35:27 · 82 阅读 · 0 评论 -
不安全的HashMap及其改进
//多线程使用HashMap是极为不安全的 //这在JDK8之前是这样,使用jps和jstack命令你会发现线程成环现象,有可能造成死锁,从而程序永远不可能结束 //jps可以查看当前系统所有java程序的进程 //而jstack可以查看给定java进程的内部线程和堆栈 //所以在JDK8中采用Collections.synchronizedMap代替HashMap,就解决了上述问题 //publ...原创 2019-08-28 23:18:13 · 224 阅读 · 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 · 1208 阅读 · 1 评论 -
CopyOnWriteArrayList
//之前我们学过ReadWriteLock读写锁 //他有一个缺点就是读取需要锁 //而CopyOnWriteArrayList的读取操作不需要锁 //所以它比上一个更高级 //CopyOnWriteArrayList使用了一种叫写时复制的方法 //当有新元素添加到CopyOnWriteArrayList时,先从原有的数组中拷贝一份出来,然后在新的数组做写操作 //写完之后,再将原来的数组引用指向...原创 2019-08-28 23:19:31 · 75 阅读 · 0 评论 -
锁优化
//锁的优化 //对于单核CPU而言,并行算法的效率一般低于串行算法的效率 //锁优化的几点建议 //1.减小锁持有时间 //public synchronized void creat(){ // method1(); // method2(); // method3() // } //其中method2是一个轻量级方法,但是其余两个都是重量级方法 //每一个线程获取该锁之后,其余线程都需...原创 2019-08-28 23:20:04 · 71 阅读 · 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 · 248 阅读 · 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 · 217 阅读 · 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 · 164 阅读 · 0 评论