1、线程和进程的区别:
线程是资源分配的最小单位;进程是程序执行的最小单位。打开QQ就是开了一个进程,QQ里的各项功能就是一个个线程去执行;
2、Thread类的常见方法:
Thread(Runnable target) :实例化时传入Runnable对象
start();//启动线程
getId();//获得线程ID
getName();//获得线程名字
getPriority();//获得优先权
isAlive();//判断线程是否活动
isDaemon();//判断是否守护线程
getState();//获得线程状态
sleep(long mill);//休眠线程
join();//等待线程结束
yield();//放弃cpu使用权利
interrupt();//中断线程
currentThread();//获得正在执行的线程对象
3、可以用什么手段来解决线程安全性问题:
1、synchronized锁
2、使用原子类操作:Atomic
3、使用juc下的:concrruntHashMap
4、Lock锁
4、Synchronized和Lock锁的区别:
1、用法不同:
synchronized:在需要同步的对象中加入此控制,synchronized可以加在方法上,也可以加在特定代码块中,括号中表示需要锁的对象
lock:一般使用ReentrantLock类做为锁。在加锁和解锁处需要通过lock()和unlock()显示指出。所以一般会在finally块中写unlock()以防死锁。
2、性能不同:
在资源竞争不是很激励的情况下,synchronized的性能要优于ReentrantLock,带在资源紧张很激烈的情况下,synchronized的性能会下降的很快,而ReentrantLock的性能基本保持不变。
3、抄一下网上总结的:
Synchronized是关键字,内置语言实现,Lock是接口。
Synchronized在线程发生异常时会自动释放锁,因此不会发生异常死锁。Lock异常时不会自动释放锁,所以需要在finally中实现释放锁。
Lock是可以中断锁,Synchronized是非中断锁,必须等待线程执行完成释放锁。
Lock可以使用读锁提高多线程读效率。
Lock:底层是CAS乐观锁,依赖AbstractQueuedSynchronizer类,把所有的请求线程构成一个CLH队列。而对该队列的操作均通过Lock-Free(CAS)操作
Lock用代码玩玩(例子用的网上找的,自己敲一下看看执行情况):
public class LockTest {
public static void main(String[] args) {
Ticket ticket = new Ticket();
Thread firstThread = new Thread(ticket, "售票窗口A");
Thread secondThread = new Thread(ticket, "售票窗口B");
firstThread.setPriority(Thread.MIN_PRIORITY); //设置优先级
secondThread.setPriority(Thread.NORM_PRIORITY);
secondThread.start();
firstThread.start();
}
}
class Ticket implements Runnable{
private int ticketNumber = 100;
private Lock lock = new ReentrantLock();
@Override
public void run() {
while (true){
lock.lock();
try {
if (ticketNumber > 0) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "售票一张,现在还剩票数为:" + --ticketNumber);
}
} finally {
lock.unlock();
}
}
}
}
4、什么是AQS、ReentrantLock和ReentrantReadWriteLock锁:
憋不住了。休息会,搞这些概念真的无聊,去敲代码实现以下。