多线程

xiaoxiao2021-02-27  310

*http://www.cnblogs.com/GarfieldEr007/p/5746362.html

*进程的五种基本状态 - 操作系统 创建状态:进程在创建时需要申请一个空白PCB,向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态

就绪状态:进程已经准备好,已分配到所需资源,只要分配到CPU就能够立即运行

执行状态:进程处于就绪状态被调度后,进程进入执行状态

阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进入就绪状态等待系统调用

终止状态:进程结束,或出现错误,或被系统终止,进入终止状态。无法再执行

*Java实现多线程的3种方法: 1)继承Thread类 2)实现runnable接口 3)使用ExecutorService,Callable、Future实现有返回值的多线程。前2种线程的实现方式没有返回值,第三种实现方式可以获取线程执行的返回值。

*同步异步和阻塞非阻塞的区别?前者和后者的区别在于,前者重点在于整体是否顺利运行,比如A执行后B才能执行,如果A没有执行完,B则保持等待;而后者重点在于当前线程是否能同时做多件事情。

*Redis到底是多线程还是单线程

*Redis备份及回收策略

*单线程多路复用和多线程加锁的区别 多路复用是通过等待IO时处理其它请求来提升效率,如果性能瓶颈在 IO 上,那么这个是很有效的。用银行排队来比喻,假如每个人的业务都需要柜员处理1分钟,客户处理10分钟(填单子之类的),那 IO 多路复用就是,但是等客户填单子的时候继续处理下一个人的,不在那儿等着,填好单子继续处理;多线程就是开5个柜台。 两者都能提高并发能力,但IO多路复用的仅在瓶颈在IO的时候有效果。比如上面的例子改成柜员处理10分钟,客户1分钟,那即使柜员不等着继续处理下一个人的,也提升不了多少性能。如果是计算密集型的,瓶颈在CPU,那么使用多线程比较好。 上面说的两种模式是可以一起用的。golang就是这个模型。io部分默认是多路复用的,同时可以起多个goroutine并发处理,所以性能很好。

*JavaIO流及NIO如何实现多路复用

*LRU(最近最少使用)和LFU(最近最不常用)算法的区别

*countdownlatch使用方法>>原文内容

*有对象锁有类锁 锁不是基于方法的 想要释放锁就要获得锁

*锁的分类 共享锁(读锁S锁):一个事务lock in share mode,其他事务只能读数据不能更新数据 排他锁(写锁X锁):一个事务for update加上排他锁,其他事务不能对相关数据加其他锁 update、insert、delete默认会加排他锁

*线程池的submit和execute方法的区别:前者执行会返回一个future对象,可以通过这个future对象获取到线程内部的内容,后者只是会执行线程,但是没有返回值。

*Java 启动线程三种方式 继承Thread,实现Runnable接口,直接在函数体使用 实现Runnable接口优势: 1)适合多个相同的程序代码的线程去处理同一个资源 2)可以避免Java中的单继承的限制 3)增加程序的健壮性,代码可以被多个线程共享,代码和数据独立。 继承Thread类优势: 1)可以将线程类抽象出来,当需要使用抽象工厂模式设计时。 2)多线程同步(值得商榷,实现Runnable接口也可以实现多线程同步) 在函数体使用优势 1)无需继承thread或者实现Runnable,缩小作用域。 另外,实现Runnable接口的线程自身无法启动,只能通过系统线程启动,如:Thread t = new Thread(new Runnable()).start();

*多线程数据共享与不共享:http://blog.csdn.net/u011277123/article/details/68482933

*多线程使用的优缺点? 优点: (1)多线程技术使程序的响应速度更快 (2)当前没有进行处理的任务可以将处理器时间让给其它任务 (3)占用大量处理时间的任务可以定期将处理器时间让给其它任务 (4)可以随时停止任务 (5)可以分别设置各个任务的优先级以及优化性能 缺点: (1)等候使用共享资源时造成程序的运行速度变慢 (2)对线程进行管理要求额外的cpu开销 (3)可能出现线程死锁情况。即较长时间的等待或资源竞争以及死锁等症状。

*start()方法和run()方法简介和区别? 1)调用start方法方可启动线程, 2)而run方法只是thread的一个普通方法调用,还是在主线程里执行。 3)把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用run()方法,这是由jvm的内存机制规定的。 4)并且run()方法必须是public访问权限,返回值类型为void.。

*Runnable接口和Callable接口的相同点和不同点? 相同点: Callable和Runnable都是接口 Callable和Runnable都可以应用于Excutors 不同点: Callable要实现call方法,Runnable要实现run方法 call方法可以返回值,run方法不能 call方法可以跑出checked exception,run方法不能 Runnable接口在jdk1.1就有了,Callable在jdk1.5才有

*volatile关键字的作用是什么? (1)多线程使用volatile关键字修饰的变量,保证了其在多线程之间的可见性,即每次读取到volatile变量,一定是最新的数据 (2)Java代码执行中,为了获取更好的性能JVM可能会对指令进行重排序,多线程下可能会出现一些意想不到的问题。使用volatile则会对禁止语义重排序,当然这也一定程度上降低了代码执行效率

*CyclicBarrier和CountDownLatch的区别是什么?

*ReentrantLock公平锁和非公平锁》原文内容

*java锁机制,LOCK的实现类》原文内容

*Reentrant英文意思为重入。ReentrantLock即重入锁。 ReentrantLock提供了与synchronized相同的互斥和内存可见性的保证。获得ReentrantLock的锁与进入synchronized块有着相同的内存语义,释放ReentrantLock锁与退出synchronized块有相同的内存语义。 那么为什么要创建与synchronized如此相似的东西呢?原因是synchronized在大部分情况下能够很好的工作,但是有些功能上存在着局限:

1.内部锁不能中断那些正在等待获取锁的进程,并且在请求锁失败的情况下,线程必须无限等待; 2.内部锁必须在获取它们的代码块中被释放;这很好的简化了代码,但是在某些情况下,一个更灵活的加锁机制提供了更好的活跃度和性能。

反之ReentrantLock拥有如下优点:

1.ReentrantLock可以轮询和可定时的锁请求。lock.tryLock() 2.ReentrantLock可中断的锁获取操作。lock.lockInterruptibly() 3.jdk6之前,ReentrantLock性能优于synchronized。JDK6开始,两者性能差不多。

相对于synchronized来说,synchronized的锁的获取是释放必须在一个模块里,获取和释放的顺序必须相反,而Lock则可以在不同范围内获取释放,并且顺序无关。

转载请注明原文地址: https://www.6miu.com/read-3745.html

最新回复(0)