随笔分类 - java thread线程
1
摘要:https://mp.weixin.qq.com/s?__biz=MzIxMjE5MTE1Nw==&mid=2653192000&idx=1&sn=118cee6d1c67e7b8e4f762af3e61643e&chksm=8c990d9abbee848c739aeaf25893ae4382eca
阅读全文
摘要:五、可中断获取锁的实现(独占锁的特性之一) 我们知道lock相较于synchronized有一些更方便的特性,比如能响应中断以及超时等待等特性,现在我们依旧采用通过学习源码的方式来看看能够响应中断是怎么实现的。可响应中断式锁可调用方法lock.lockInterruptibly();而该方法其底层会
阅读全文
摘要:一、序言 Lock接口是juc包下一个非常好用的锁,其方便和强大的功能让他成为synchronized的一个很好的替代品。 我们常用的一个Lock的实现类(好像也是唯一一个只实现了Lock接口的类) 当你查看源码时你会惊讶的发现ReentrantLock并没有多少代码,另外有一个很明显的特点是:基本
阅读全文
摘要:之前关于Java线程的时候,都是通过实现Runnable接口或者是实现Callable接口,前者交给Thread去run,后者submit到一个ExecutorService去执行。 然后知道了还有个FutrureTask接口,而且好像很有用,在刚看完线程池的相关源码还有点记忆的情况下,就再顺便研究
阅读全文
摘要:我们知道,ExecutorService是一个抽象出线程池的一个接口,然后我们在使用线程池的时候,用的是Executors工具类中的一系列newCachedThreadPool() 等类似的方法,这些方法之间返回一个可以用的线程池。但其实这些方法都是在里面调用了一个类——ThreadPoolExec
阅读全文
摘要:一、HashTable hashTable是一个线程安全的容器,是线程安全版本的HashMap。但它的底层是和HashMap一样的,只是在方法上都加上了synchronized关键字。 这样子有什么后果呢: 类似于这样的方法,当线程1在执行if里面的判断的时候,线程1会获得table实例的所,其他线
阅读全文
摘要:ThreadLocal介绍 ThreadLocal,顾名思义,线程局部变量。对于同一个static ThreadLocal,不同线程只能从中get,set,remove自己的变量,而不会影响其他线程的变量。 我们可以把它看作是一个改装过的一个类,我们假设现在有一个这个类的公共实例变量,有好几个线程它
阅读全文
摘要:这里对几个常见的的名词进行介绍 Executor 这是个接口,只声明了一个方法—— Executors 然后是Executors类,这个可以看作是个公共类,它提供了许多强大有用的获取线程池的static方法: 1.public static ExecutorService newFixedThrea
阅读全文
摘要:digest synchronized已经提供了锁的功能,而且还是Java的内置特性,那为什么还要出现lock呢? 用一句话来讲就是——synchronized可以实现同步,但太死板了它的同步机制;lock可以提供更灵活更丰富的同步、并发机制,提供了许多有用的功能。 synchronized的缺陷:
阅读全文
摘要:volatile就可以说是java虚拟机提供的最轻量级的同步机制 特性: 1.保证共享变量的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的——要了解主存、高速缓存还有Java内存模型中线程的工作内存、主存等概念。 2.禁止指令重新排序,一定程度上保证有序性。——要理解Java
阅读全文
摘要:上一篇博客虽然题目叫内置锁的基本使用,但其实也是讲synchronized关键字的使用的。这篇博客是在看了许多大佬的博客记录后总结出的synchronized更底层的知识和原理。 一、synchronized的原理 同步块的monitor指令 我们先通过反编译下面的代码来看看Synchronized
阅读全文
摘要:一、简单的锁知识 关于内置锁 Java具有通过synchronized关键字实现的内置锁,内置锁获得锁和释放锁是隐式的,进入synchronized修饰的代码就获得锁,走出相应的代码就释放锁。 java内置锁是一个互斥锁,这就是意味着最多只有一个线程能够获得该锁,当线程A尝试去获得线程B持有的内置锁
阅读全文
摘要:一、线程的状态 (参考文章:https://blog.csdn.net/a58220655/article/details/76695142) 状态介绍 新建(new):处于该状态的时间很短暂。已被分配了必须的系统资源,并执行了初始化。表示有资格获得CPU时间。调度器可以把该线程变为runnable
阅读全文
摘要:这里有个这样的程序,设计个简单的银行,假设某家银行,它可接受顾客的汇款,每做一次汇款,便可计算出汇款的总额。现在有两个客户,都对银行里同一个账户进行存钱取钱操作。测试synchronized关键字的作用。 现在上代码: 主要测试类: 银行类: 抽象客户类和两个客户的runnable类: 银行的存钱d
阅读全文
摘要:先抛出一个例子: 现在我们有一个馒头的例子。有做馒头的师傅,有个篮子,也有吃馒头的人。然后我们要用程序来模拟这个东西。 这是篮子的图示,其中因为篮子有个特点就是后放进去的先拿出来,陷进去的后拿出来,所以决定用数据结构栈来模拟它,这是一种据说也是先进后出的数据结构喔。 那么篮子满了6个怎么办呢?这里引
阅读全文
摘要:什么是线程同步,先来举一个小例子吧: 我现在银行账户里有3000块,一天我去柜台机那里想取款2000元,我向柜台机完成了操作后,机器自动检查我的账户,看看够不够钱,发现够,于是准备吐钱(但又还没吐)。就在这个时候,我的老婆在另一个银行也准备取款,她也想取2000,她输入后,机器也去检查我的账户够不够
阅读全文
摘要:注意start()了不代表你就执行了喔,因为cpu像个厕所,有n多线程在排队呢,凭什么你一start就要执行你。所以start了只是说你开始排队了,你准备好了,属于就绪状态。当然这个过程太快我们是感觉不到的。 这是几个线程的状态转换,那么怎么控制线程的状态转换呢? 阻塞也还在活着,终止和new出来没
阅读全文
摘要:如果要特别专业地去理解线程的话,这个可能要去看操作系统原理了,什么cpu的执行,怎么把一个进程调进来 我们要理解的话,就————线程就是一个程序里面不同的执行路径。 看个例子: 每一个长方形都是个方法,黄色那个是main方法,右边那个是m1方法,再右边是m2,m3方法 这么多方法,我们这个有几个线程
阅读全文
1
浙公网安备 33010602011771号