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

浙公网安备 33010602011771号