Java多线程

1 创建线程的两种方式及其具体步骤,并且指出那种更优
方法一:继承Java.lang.Thread类,并覆盖run() 方法。优势:编写简单;劣势:无法继承其它父类
方法二:实现Java.lang.Runnable接口,并实现run()方法。优势:可继承其它类,多线程可共享同一个
Thread对象;劣势:编程方式稍微复杂,如需访问当前线程,需调用Thread.currentThread()方法

2 线程死锁
死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程
被无限期地阻塞,因此程序不可能正常终止。
同步代码块,所使用的同步锁可以是三种,
1、this 2、 共享资源 3、 字节码文件对象

java 死锁产生的四个必要条件:

1、互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用
2、不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。
3、请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占有。
4、循环等待,即存在一个等待队列:P1占有P2的资源,P2占有P3的资源,P3占有P1的资源。这样就形成了一个等待环路。
当上述四个条件都成立的时候,便形成死锁。当然,死锁的情况下如果打破上述任何一个条件,便可让死锁消失。下面用java代码来模拟一下死锁的产生。
解决死锁问题的方法是:一种是用synchronized,一种是用Lock显式锁实现。
而如果不恰当的使用了锁,且出现同时要锁多个对象时,会出现死锁情况

3 什么是线程安全问题 同步代码块使用时注意事项是什么
当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行
额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那么这个对象是线程安全的。

在java中每个类对应一把锁,每个对象对应一把锁。 
分几种情况: 
1.其他方法前是否加了synchronized关键字,如果没加,则能。 
2.如果这个方法内部调用了wait,则可以进入其他synchronized方法。 
3.如果其他个方法都加了synchronized关键字,并且内部没有调用wait,则不能。 
4.如果其他方法是static,它用的同步锁是当前类的字节码,与非静态的方法不能同步,因为非静态的方法用的是this。(线程1调用非静态的synchronized方法,线程2调用静态的synchronized方法,两者互不影响。 注:如果线程1和2,同为非静态或静态,则必须等一个线程执行完,再执行下一个。)

4线程类主要有哪些方法
1. wait():使一个线程处于等待(阻塞)状态,并且释放所持有的对象的锁;
2. sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException 异常;
3. start():线程开启
4:run()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值