同步 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();
}
}