同步 synchronized 同步代碼塊 來給要操作的數據上鎖
同步的優點和缺點 :
缺點 : 線程的工作的效率變低了
優點 : 更安全
同步的前提:
多個線程同時操作共享同一數據的時候
同步代碼塊需要注意的點:鎖對象Object對象的New的位置
同步代碼塊
synchronized(鎖對象){
}
同步函數的鎖 Ticket.class 當前類的字節碼文件對象 也可以作爲鎖的對象
懶漢式解決多線程安全的問題
class Person{
private static Person p;
private Person(){
}
public static Person getInstance(){
//t0 t1 儘量少去判斷鎖
if(p == null){
synchronized (Person.class) {//用類的字節碼文件對象
if(p == null){
p = new Person();
}
}
}
return p;
}
}
死鎖
class{
public static final Lock locka = new Lock();
public static final Lock lockb = new Lock();
}
class Demo implements Runnable{
private boolean flag;
public Demo(boolean flag) {
this.flag = flag;
}
@Override
public void run() {
if(flag){
while(true){
synchronized (Lock.locka) {
System.out.println("if locka..."); //t1
synchronized(Lock.lockb){
System.out.println("if lockb..");
}
}
}
}else{////t1 t2
while(true){
synchronized (Lock.lockb) {
System.out.println("else lockb..");//t2
synchronized(Lock.locka){
System.out.println("else locka...");
}
}
}
}
}
}
測試類
public class DeadLockDemo {
public static void main(String[] args) {
Demo d1 = new Demo(true);
Demo d2 = new Demo(false);
Thread t1 = new Thread(d1);
Thread t2 = new Thread(d2);
t1.start();
t2.start();
}
}