状态变量

Java并发67问

守給你的承諾、 提交于 2020-01-31 04:00:54
1. 并发和并行 2. 进程和线程 对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开一个Word就启动了一个Word进程。 而在多个进程之间切换的时候,需要进行上下文切换。但是上下文切换势必会耗费一些资源。于是人们考虑,能不能在一个进程中增加一些“子任务”,这样减少上下文切换的成本。比如我们使用Word的时候,它可以同时进行打字、拼写检查、字数统计等,这些子任务之间共用同一个进程资源,但是他们之间的切换不需要进行上下文切换。 在一个进程内部,要同时干多件事,就需要同时运行多个“子任务”,我们把进程内的这些“子任务”称为线程。 随着时间的慢慢发展,人们进一步的切分了进程和线程之间的职责。 把进程当做资源分配的基本单元,把线程当做执行的基本单元,同一个进程的多个线程之间共享资源 3. 类变量,成员变量和局部变量 Java中共有三种变量,分别是类变量、成员变量和局部变量。他们分别存放在JVM的方法区、堆内存和栈内存中 public class Variables { /** * 类变量 */ private static int a ; /** * 成员变量 */ private int b ; /** * 局部变量 * @param c */ public

2020-01-29

拜拜、爱过 提交于 2020-01-30 07:31:46
自己的一些面试总结 线程 多线程 线程的创建方式 1.继承Thread类创建线程 2.实现Runnable接口创建线程 3.使用Callable和future创建线程 4.使用线程池例如用Executor框架 线程怎么启动 Thread.start();//开启线程 Thread.run();当普通方法的方式调用 线程的状态(就绪、运行、阻塞、结束) 1.新建状态:当用new操作符创建一个线程时,线程还没有开始运行,此时线程处在新建状态 2.就绪状态:一个新创建的线程并不自动开始运行,要执行线程,必须调用线程start()方法。当线程对象调用start()方法即启动了线程,start()方法创建线程运行的系统资源,并调度线程运行run()方法。当start()方法返回后,线程就处于就绪状态 3.运行状态 当线程获取cpu时间后,他才进入运行状态,真正开始执行run()方法 4,阻塞状态:线程运行过程中,肯峨眉号各种原因进入阻塞状态; sleep方法进入睡眠状态 线程在等待某个触发条件 线程的同步 同步就是发出一个功能调试时,在没有得到结果之前,该调用就不返回或继续执行后续操作。 异步与同步相对,当一个异步过程调用发出后,调用者在没有得到结果之前,就可以继续执行后续操作。 线程、进程的区别 线程和进程都是一个时间段的描述,是cpu工作时间段的描述。 进程的颗粒太大

Java并发包中Lock的实现原理

家住魔仙堡 提交于 2020-01-30 01:13:24
转自:http://www.knowsky.com/889710.html http://blog.csdn.net/ghsau/article/details/7461369/ 很好可以看下 实现Lock接口的基本思想 需要实现锁的功能,两个必备元素,一个是表示(锁)状态的变量(我们假设0表示没有线程获取锁,1表示已有线程占有锁),另一个是队列,队列中的节点表示因未能获取锁而阻塞的线程。为了解决多核处理器下多线程缓存不一致的问题,表示状态的变量必须声明为voaltile类型,并且对表示状态的变量和队列的某些操作要保证原子性和可见性。原子性和可见性的操作主要通过Atomic包中的方法实现。 线程获取锁的大致过程(这里没有考虑可重入和尝试获取锁过程被中断或超时的情况) 1. 读取表示状态的变量 2. 如果表示状态的变量的值为0,那么当前线程尝试将变量值设置为1(通过CAS操作完成),当多个线程同时将表示状态的变量值由0设置成1时,仅一个线程能成功,其 它线程都会失败 2.1 若成功,表示获取了锁, 2.1.1 如果该线程已位于在队列中,则将其出列(并将下一个节点则变成了队列的第一个节点) 2.1.2 如果该线程未入列,则不用对队列进行维护 然后当前线程从lock方法中返回,对共享资源进行访问。 2.2 若失败,则当前线程将自身放入等待(锁的)队列中并阻塞自身

Java并发包中Lock的实现原理

浪尽此生 提交于 2020-01-30 01:12:55
Java并发包中Lock的实现原理 1. Lock 的简介及使用 Lock是java 1.5中引入的线程同步工具,它主要用于多线程下共享资源的控制。本质上Lock仅仅是一个接口(位于源码包中的java\util\concurrent\locks中),它包含以下方法 //尝试获取锁,获取成功则返回,否则阻塞当前线程 void lock(); //尝试获取锁,线程在成功获取锁之前被中断,则放弃获取锁,抛出异常 void lockInterruptibly() throws InterruptedException; //尝试获取锁,获取锁成功则返回true,否则返回false boolean tryLock(); //尝试获取锁,若在规定时间内获取到锁,则返回true,否则返回false,未获取锁之前被中断,则抛出异常 boolean tryLock(long time, TimeUnit unit) throws InterruptedException; //释放锁 void unlock(); //返回当前锁的条件变量,通过条件变量可以实现类似notify和wait的功能,一个锁可以有多个条件变量 Condition newCondition(); Lock有三个实现类,一个是ReentrantLock

shell变量状态赋值

天大地大妈咪最大 提交于 2020-01-29 19:36:02
${VAR:-string} 如果VAR变量为空则返回string ${VAR:+string} 如果VAR变量不为空则返回string ${VAR:=string} 如果VAR变量为空则重新赋值VAR变量值为string ${VAR:?string} 如果VAR变量为空则将string输出到stderr [root@localhost ~]# var= [root@localhost ~]# [root@localhost ~]# echo ${var:=12345} 12345 [root@localhost ~]# echo $var 12345 来源: CSDN 作者: wo1769815 链接: https://blog.csdn.net/wo1769815/article/details/104108809

Java内存模型与线程

假如想象 提交于 2020-01-29 07:32:02
Java内存模型与线程 每秒事务处理数(Transactions Per Second,TPS)、 Java语言和虚拟机提供了许多工具,把并发编程的门槛降低了不少。另外,各种中间件服务器、各类框架 12.2 硬件的效率与一致性 现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(Cache)来作为内存与处理器之间的缓冲: 为了解决一致性的问题,需要各个处理器访问缓存时都遵循一些协议,在读写时要根据协议来进行操作,这类协议有MSI、MESI(IllinoisProtocol)、MOSI、Synapse、Firefly及Dragon Protocol,等等 为了使得处理器内部的运算单元能尽量被充分利用,处理器可能会对输入代码进行乱序执行(Out-Of-Order Execution)优化,处理器会在计算之后将乱序执行的结果重组,保证该结果与顺序执行的结果是一致的,类似,Java虚拟机的即时编译器中也有类似的指令重排序(Instruction Reorder)优化。 12.3 Java内存模型 用来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的并发效果。 12.3.1 主内存与工作内存 此处的变量包括了实例字段、静态字段和构成数组对象的元素,但是不包括局部变量与方法参数,因为后者是线程私有的[插图],不会被共享

java中常用的锁机制

*爱你&永不变心* 提交于 2020-01-28 20:44:38
基础知识 基础知识之一:锁的类型 锁就那么几个,只是根据特性,分为不同的类型 锁的概念 在计算机科学中,锁(lock)或互斥(mutex)是一种同步机制,用于在有许多执行线程的环境中强制对资源的访问限制。锁旨在强制实施互斥排他、并发控制策略。 锁通常需要硬件支持才能有效实施。这种支持通常采取一个或多个原子指令的形式,如"test-and-set", "fetch-and-add" or "compare-and-swap"”。这些指令允许单个进程测试锁是否空闲,如果空闲,则通过单个原子操作获取锁。 锁的三个概念 1、锁开销 lock overhead 锁占用内存空间、 cpu初始化和销毁锁、获取和释放锁的时间。程序使用的锁越多,相应的锁开销越大 2、锁竞争 lock contention 一个进程或线程试图获取另一个进程或线程持有的锁,就会发生锁竞争。锁粒度越小,发生锁竞争的可能性就越小 3、死锁 deadlock 至少两个任务中的每一个都等待另一个任务持有的锁的情况锁粒度是衡量锁保护的数据量大小,通常选择粗粒度的锁(锁的数量少,每个锁保护大量的数据),在当单进程访问受保护的数据时锁开销小,但是当多个进程同时访问时性能很差。因为增大了锁的竞争。相反,使用细粒度的锁(锁数量多,每个锁保护少量的数据)增加了锁的开销但是减少了锁竞争。例如数据库中,锁的粒度有表锁、页锁、行锁、字段锁

ARM Linux下UPnP使用

让人想犯罪 __ 提交于 2020-01-28 11:56:29
一、UPnP简介 UPnP(Universal Plug and Play)技术是一种屏蔽各种数字设备的硬件和操作系统的通信协议。它是一种数字网络中间件技术,建立在TCP/IP、HTTP协议之上,采用XML来描述设备和控制信息。这种技术最开始是被微软,因特尔等公司使用在数字家庭中的,用来在家庭网络中完成多媒体资源共享,家电一体化等功能,例如在各种家电上实现IP数字化,加入网络传输和控制部分,从而让家电能组建UPnP网络,这种技术能让人们在上班或者外地出差时能查看家庭情况,如:是否有家电忘记关闭;监控家庭情况;或者在回家之前打开家里的热水器并设置水温;在天热时提前打开空调;打开电饭煲开始蒸饭…… 这些应用由于家电厂商的不积极(目前能连接到网络的家电可能只有电视吧),或许是成本问题等,UPnP设计之初想要达到的数字家庭并未得到普及和广泛应用。但是UPnP的特有特性还是很吸引人的,它最大的特性是它的消息发送是通过HTTP协议发送,所有的消息内容都是通过XML包装的,这种消息传输模式使得我们能通过浏览器访问和控制支持UPnP协议的设备,再来让我们看看传统的嵌入式网络的通信吧,大多数设备之间网络通信直接使用TCP/IP上的socket编程,这种通信模式需要通信的双方制定好通信数据的格式包,在客户端和服务器端都需要进行编程,而且一旦项目需求发生变化,通信格式发生变化时

java并发变成及juc包的应用

╄→尐↘猪︶ㄣ 提交于 2020-01-28 03:51:22
多线程: windows操作系统是多任务操作系统,它以进程为单位,一个进程是一个包含有自身地址的程序,每个正在独立执行的程序都称为进程,进程是系统进行资源分配和调用的独立单位,每个进程有自己的内存空间和系统资源。系统可以分配给每个进程一段有限的使用CPU时间,CPU在这个时间片中执行某个进程,然后下一个时间片又跳到另一个进程中去执行,由于CPU转换较快,所以使的每个进程好像同时进行,多核CPU的多核同时运行,但是进程数远远大于核数,所以还是要依靠切换进程来做。一个线程则是进程中的执行流程,一个进程中可以同时包括多个线程,每个线程也可以得到一小段程序的执行时间,这样一个进程就可以具有多个并发执行的线程,在单线程中,程序的代码按照调用顺序依次往下执行,如果需要一个进程同时完成多段代码的操作,就需要产生多线程(多条执行路径)。多线程可以提高应用程序的使用率,为了有更高的几率抢到CPU的执行权,但我们不能保证哪一个线程能够在哪一个时刻抢到,所以线程的执行有随机性。在并发编程中,我们通常会遇到以下三个问题:原子性问题,可见性问题,有序性问题。 线程的两种调度模型:平均分配每个线程占用CPU的时间片,上面说的就是这种,第二种就是抢占式调度模型:优先让优先级高的线程使用CPU,如果线程的优先级相同,会随机选一个,优先级高仅仅表示线程获取的cpu时间片的几率相对对多些

【Java】多线程初探

拟墨画扇 提交于 2020-01-27 02:31:03
参考书籍: 《Java核心技术 卷Ⅰ 》 Java的线程状态 从操作系统的角度看,线程有5种状态:创建, 就绪, 运行, 阻塞, 终止(结束)。如下图所示 而Java定义的线程状态有: 创建(New), 可运行(Runnable), 阻塞(Blocked), 等待(Waiting), 计时等待(Time waiting) 被终止(Terminated)。 那么相比起操作系统的线程状态, Java定义的线程状态该如何解读呢? 如下: 1. Java的阻塞、 等待、 计时等待都属于操作系统中定义的阻塞状态,不过做了进一步的划分,阻塞(Blocked)是试图获得对象锁(不是java.util.concurrent库中的锁),而对象锁暂时被其他线程持有导致的;等待(Waiting)则是调用Object.wait,Thread.join或Lock.lock等方法导致的;计时等待(Time waiting)则是在等待的方法中引入了时间参数进入的状态,例如sleep(s) 2. Java的Runnable状态实际上包含了操作系统的就绪和运行这两种状态, 但并没有专门的标识进行区分,而是统一标识为Runnable 获取当前线程的状态和名称 currentThread()是Thread类的一个静态方法,它返回的是当前线程对象 对某个线程对象有以下方法: getState方法:返回该线程的状态