2017-9-07 - A - 线程
1 同步和异步的转换靠什么?什么是同步什么是异步?
join()
同步即顺序执行,异步即同时执行。
2 异步存在于?
多个线程。
3 停止线程有几种方式?
①run方法执行完自然停止
②调用该线程的interrupt方法
③抛出错误
4 如何调用join方法?
被调用join方法线程必须为final,调用join方法代码块必须捕捉错误。
如
Thread show = new Thread(){
public void run(){
try {
download.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("开始显示图片");
if(!isFinish){
throw new RuntimeException("图片未下载完成。");
}
System.out.println("显示图片");
}
};
5 一个方法的局部内部类中想引用这个方法的其他局部变量,那么该局部变量必须是final的
,这是由于JVM内存分配问题,JAVA8后无问题?
正确。
6 多线程并发安全问题是?
由于线程之间的运行是异步的,互相没有牵制,但访问同一资源时便出现了“抢”的现象。
由于线程发生切换现象的实际不确定导致代码执行顺序可能未按照设计的顺序执行,
出现不可预知后果。如同时以两种方式取钱。
7 如何模拟现成的切换?
使用Thread.yield——主动回归Runnable状态
8 如何解决线程并发安全问题?
将Synchronized加在运行方法或创建同步块,加上同步锁。
class Table{
private int beans = 20;
/**
* 当一个方法被synchronized修饰后,该方法称为同步方法,即:
* 多个线程不能同时进入到方法内部去执行代码。这样就不会同时对beans
执行到synchronized的方法检测有无锁,有锁则切换到另一个线程。
* 这个数据操作,没有抢的问题,就不会出现并发安全问题。
* @return
*/
public synchronized int getBean(){
if(beans==0){
throw new RuntimeException("没有豆子了");
}
Thread.yield();
return beans--;
}
}
9 如何使用同步块?传入什么对象?
保证传入的对象相同即可。
synchronized(this){
System.out.println(t.getName()+"正在试衣服..");
Thread.sleep(5000);
}
传入相同的对象。
在一个方法上使用sychronized修饰,那么同步监视器对象就是该方法
所属对象即方法内部看到的this
10 静态方法加synchronized会怎样?
一定会有同步效果,与对象无关,因为全局就一份静态方法。
* 静态方法使用synchronized修饰后,该方法一定具有同步效果,实例化不同的对象同时调用也会同步。JVM在加载每个类的时候,都会实例化一个且只实例化一个Class的实例用来描述这个类。而静态方法所得就是这个通用的对象。
* 而非静态方法同时调用则不同步(不同对象各有一份)。
11 什么是互斥锁?
干这件事的时候不能干另一件事。
互斥锁
* synchronized修饰不同的代码片段,当同步监视器对象相同时,这些代码之间
* 就是互斥的。多个线程不能同时进到这些代码片段中执行。
12 同步锁与互斥锁的区别是什么?
都是发生在同一个对象里,都是锁同一个对象,
同步是不能同时调用一个方法,互斥是
13 如何判断是否用锁?
有抢的现象,抢变量,
所以必须排队干,而为了排队,必须保证不同线程间看到的对象是相同的。
而互斥呢,必须保证不同线程间看到的对象是相同的,锁才能起效。
14 StringBuffer是线程安全的,StringBuilder呢?
不是。
15 多线程中使用集合和列表需要注意什么?
转换成线程安全的,
list = Collections.synchronizedList(list);
set = Collections.synchronizedSet(set);
16 哪怕是线程安全的集合也不与迭代器遍历该集合互斥,所以在开发时自行维护互斥关系?
17 线程池一般用于解决什么问题?
线程重用防止内存溢出,控制线程数量。
18 如何新建线程池?如何将线程添加入线程池?如何关闭线程池?如何立刻关闭所有线程池?
ExecutorService threadPool = Executors.newFixedThreadPool(2);
threadPool.excute(thread);
threadPool.shutDown / threadPool.shutDwnNow
19 并发中需要使用队列用什么?
双缓冲队列,线程安全。

浙公网安备 33010602011771号