随笔分类 -  【基础】-多线程的使用

详细介绍线程的使用
摘要:不会释放锁的操作: 线程执行同步代码或同步方法时,程序调用了Thread.sleep()、Thread.yield()方法暂停当前线程的执行; 线程执行同步代码块时,其它线程调用了该线程的suspend()方法将该线程挂起,该线程不会释放锁(同步监视器); 注意:应尽量避免使用suspend()和r 阅读全文
posted @ 2020-10-22 10:18 小小吸血鬼 阅读(581) 评论(0) 推荐(0)
摘要:首先要了解独占锁和共享锁 独占锁:一次只能被一个线程占用 共享锁:多个线程可以同时占用 java.util.concurrent.locks.ReadWriteLock就是使用了独占锁和共享锁,实现了读写的控制Demo如下: public class ReadWriterLockDemo { pub 阅读全文
posted @ 2020-05-21 16:02 小小吸血鬼 阅读(233) 评论(0) 推荐(0)
摘要:java.util.concurrent.Semaphore是用来控制线程数量,可以用来做限流Deom如下: public class SemaphoreDemo { public static void main(String[] args) { //线程数量,可以用来控制限流 Semaphore 阅读全文
posted @ 2020-05-21 15:56 小小吸血鬼 阅读(168) 评论(0) 推荐(0)
摘要:java.util.concurrent.CyclicBarrier是用来作为加法计数器的,和CountDownLatch用法类似Demo如下: public class CyclicBarrierDemo { public static void main(String[] args) { //计 阅读全文
posted @ 2020-05-21 15:53 小小吸血鬼 阅读(148) 评论(0) 推荐(0)
摘要:java.util.concurrent.CountDownLatch类是用来做减法计数器的Demo如下: public class CountDownLatchDemo { public static void main(String[] args) throws InterruptedExcep 阅读全文
posted @ 2020-05-21 15:49 小小吸血鬼 阅读(237) 评论(0) 推荐(0)
摘要:ReentrantLock使用 ReentrantLock是可以替代synchronized的,但是ReentrantLock需要手动加锁(lock.lock())和解锁(lock.unlock()),手动解锁一定要写在try...finally里边保证最好一定要解锁,不然上锁后中间执行的过程就有问 阅读全文
posted @ 2020-05-05 15:53 小小吸血鬼 阅读(241) 评论(0) 推荐(0)
摘要:synchronized底层对应的JMM模型8大原子操作lock与unlock synchronized原理分析 加锁: 同步实例方法,锁是当前实例对象 同步类方法,锁是当前类对象 同步代码块,锁是括号里面的对象 原理: synchronized标记的对象在编译为指令的时候,是被moniterent 阅读全文
posted @ 2020-03-30 16:58 小小吸血鬼 阅读(191) 评论(0) 推荐(0)
摘要:线程是一种稀缺资源,他的创建和销毁是一个相对偏重且耗资源的操作,而Java线程依赖于内核线程,其线程的创建需要进行操作系统状态的切换,为避免资源过度消耗需要设法重用线程执行多个任务。线程池就是一个线程缓存,负责对线程进行统一分配、调优和监控。 什么时候使用线程: (1)单个任务处理时间比较短; (2 阅读全文
posted @ 2019-12-31 10:54 小小吸血鬼 阅读(264) 评论(0) 推荐(0)
摘要:线程可分为:1.用户级线程(ULT) 2.内核级线程(KLT):依赖于底层操作系统; JVM属于内核级线程:java线程创建是依赖于系统内核,通过JVM调用系统库创建内核线程,内核线程与java-Thread是1:1的映射关系 阅读全文
posted @ 2019-12-31 10:37 小小吸血鬼 阅读(1096) 评论(0) 推荐(0)
摘要:题目:实现一个容器,提供俩个方法,add和size,写俩个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数到5时,线程2给出提示并结束 实现案例: /** * @program: mystudy_basis * @description: 实现一个容器,提供俩个方法,add和si 阅读全文
posted @ 2019-12-30 14:17 小小吸血鬼 阅读(174) 评论(0) 推荐(0)
摘要:模拟案例: /** * @description: 模拟以字符串为锁出现的死锁 **/ public class MyStringThread { String str1 = "hello"; String str2 = "hello"; public void test1(){ synchroni 阅读全文
posted @ 2019-12-30 11:18 小小吸血鬼 阅读(213) 评论(0) 推荐(0)
摘要:答案是不能保证,具体可以参考下边案例: public class MyAtomic { AtomicInteger count = new AtomicInteger(0); public void test(){ for(int i=0;i<10000;i++){ /*此处模拟多个类连续调用:可能 阅读全文
posted @ 2019-12-30 10:47 小小吸血鬼 阅读(409) 评论(0) 推荐(0)
摘要:首先得稍微了解一下JMM(java内存模型)的相关基础知识,java中的线程在计算机使用的是内存共享的机制,所以使用volatile关键字可以理解为: (1)答案一:当被volatile关键字修饰的资源有变化的时候,计算机会把CPU中的缓存资源重新刷新一遍,达到变量可见性一致的效果。 (2)答案二: 阅读全文
posted @ 2019-12-30 10:08 小小吸血鬼 阅读(548) 评论(0) 推荐(0)
摘要:死锁的出现: 商家(线程1):先给钱再给货 消费者(线程2):先给货再给钱 阅读全文
posted @ 2019-12-13 15:50 小小吸血鬼 阅读(98) 评论(0) 推荐(0)
摘要:1.让出线程yield()方法的使用 public void run(){ for(int i=1;i<=100;i++) { System.out.println(name+"下载了" + i + "%"); //让出线程 Thread.yield(); } } 2.守护线程setDaemon() 阅读全文
posted @ 2019-12-13 15:40 小小吸血鬼 阅读(149) 评论(0) 推荐(0)
摘要:join线程会抢先拿到cup来执行线程,然后其他的线程再来执行。 案例: public static void main(String args[]){ //创建线程对象 Thread myThread1 = new Thread(new MyRunnable("爱的供养")); Thread my 阅读全文
posted @ 2019-12-13 15:33 小小吸血鬼 阅读(266) 评论(0) 推荐(0)
摘要:1.三种优先级 (1)最高优先级:MAX_PRIORITY(10) (2)普通优先级:NORM_PRIORITY(5) (3)最低优先级:MIN_PRIORITY(1) 案例代码: public static void main(String args[]){ //创建一个线程对象 MyThread 阅读全文
posted @ 2019-12-13 15:26 小小吸血鬼 阅读(314) 评论(0) 推荐(0)
摘要:1.线程间通信的出现场景 模拟生产者-消费者案例说明: 生产者生成水果,如果水果没有被买走,那么就不生产处于等待状态,如果水果被消费者买走,这时候消费者就会通知生产者水果已买走请生产,消费者同理,如果水果已经生成出来,那么就买走,买走之后再通知生产者水果没了请生产 2.线程间通信的实现 通信规则 ( 阅读全文
posted @ 2019-12-13 15:13 小小吸血鬼 阅读(206) 评论(0) 推荐(0)
摘要:1.使用synchronized修饰代码块,使用语法如下: public class Ticket implements Runnable{ /**车票库存*/ int tickets = 100; /**创建一个锁对象,这个对象有多个线程共同使用*/ static Object obj = new 阅读全文
posted @ 2019-12-13 14:30 小小吸血鬼 阅读(268) 评论(0) 推荐(0)
摘要:1.线程并发的产生 这里举一个买票的经典案例:四个窗口售卖100涨车票,代码如下: public class Ticket implements Runnable{ /**线程名称*/ private String name; /**车票库存*/ static int tickets = 100; 阅读全文
posted @ 2019-12-13 14:04 小小吸血鬼 阅读(296) 评论(0) 推荐(0)