多线程使用

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

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

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

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

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

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

*并发/高并发
硬件层面:
CPU,内存,磁盘,网络
软件层面:
线程数量,JVM内存分配大小,网络通信机制(BIO,NIO,AIO),磁盘IO

*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();

*@EnableAsync@Async使用总结
@EnableAsync开启使用多线程,@Async定义一个线程任务。
@Configuration用于定义配置类,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。
如下方法会使@Asynchronous失效
1.异步方法使用static修饰
2.异步类没有使用@Component注解(或其他注解)导致spring无法扫描到异步类
3.异步方法不能与异步方法在同一个类中?
4.类中需要使用@Autowired或@Resource等注解自动注入,不能自己手动new对象
5.如果使用springBoot框架必须在启动类中增加@EnableAsync注解
6.在Async方法上标注@Transactional是没用的。在Async方法调用的方法上标注@Transactional有效
7.调用被@Async标记的方法的调用者不能和被调用的方法在同一类中,不然不会起作用!!!
8.使用@Async时要求是不能有返回值的不然会报错的,因为异步要求是不关心结果的。
原文内容

*多线程数据共享与不共享: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则可以在不同范围内获取释放,并且顺序无关。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值