1.如何保证线程的安全
①.使用同步代码块
public class Test {
static String str[]=new String[5];
static int index=0;
public static void main(String[] args) throws Exception {
//1.创建两个任务对象
Runnable tast1=new Runnable() {//匿名内部类
public void run() {
//同步代码块
synchronized (str) {
if (str[index] == null) {
str[index] = "hello";
index++;
}
}
}
};
Runnable tast2=new Runnable() {
public void run() {
synchronized (str) {//必须是一个对象 而且共有一个资源
if (str[index] == null) {
str[index] = "world";
index++;
}
}
}
};
Thread t1=new Thread(tast1,"A");
Thread t2=new Thread(tast2,"B");
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(Arrays.asList(str));
}
}
②.使用同步方法
在方法中加上 synchronized
public class T {
public static void main(String[] args) {
Runnable tast1=new Runnable() {//匿名内部类
public synchronized void run() {
}
};
}
}
2.线程安全类有哪些?
(1) Hashtable
(2) StringBuffer
(3)Vector
Hashtable和hashmap得区别?
-
线程安全
-
key和value是否允许null
-
效率上
3.死锁
所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。
因此我们举个例子来描述,如果此时有一个线程A,拥有锁A 线程B 拥有锁B 当线程A 需要锁B 才会释放锁A 而线程B 需要锁A 才会释放锁B 两者僵持不下 就产生了死锁