局部变量和常量不会有线程安全问题,实例变量和静态变量可能会有线程安全问题。
开发中如何解决线程安全问题
1.使用局部变量代替实例变量和静态变量
2.如果必须是实例变量,就创建多个对象,对象不共享,就没有数据安全问题。
3.使用synchronized关键字,线程同步机制
synchronized的三种写法
1.同步代码块,灵活。
2.在实例方法上使用synchronized,表示共享对象一定是this,并且同步代码块是整个方法体。
3.在静态方法上使用synchronized,,表示类锁,类锁永远只有一把,就算创建多个对象,类锁也只有一把。
死锁
public class DeadLock {
public static void main(String[] args) {
Object m=new Object();
Object n=new Object();
Thread t1=new MyThread1(m,n);
Thread t2=new MyThread2(m,n);
t1.start();
t2.start();
}
}
class MyThread1 extends Thread {
Object m;
Object n;
public MyThread1(Object m, Object n) {
this.m = m;
this.n = n;
}
public void run() {
synchronized (m) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (n) {
}
}
}
}
class MyThread2 extends Thread {
Object m;
Object n;
public MyThread2(Object m, Object n) {
this.m = m;
this.n = n;
}
public void run() {
synchronized (n) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (m) {
}
}
}
}