1.线程的安全问题发生的条件
只有当线程访问了共享的数据时,才会发生线程的安全问题!!!
2.线程的同步代码块,同步方法(静态方法,普通方法)
同步代码块的锁:"为任意的一个字符串都可以锁”
同步方法(普通):锁对象就是 this (静态方法):锁对象就是本类的字节码.class对象
public class TicketDemo implements Runnable{
//private int ticket = 100;
private static int ticket = 50;
@Override
public void run() {
while (true){
// synchronized ("锁"){ //同步代码块 锁对象为任意的一个对象
// if(ticket>0){
// try {
// System.out.println(Thread.currentThread().getName()+"正在买第"+ticket+"张票");
// Thread.sleep(1000);
// ticket--;
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// }
// }
palyTicket();
}
}
public synchronized void palyTicket(){ //同步方法 所对象就是this
if(ticket>0){
try {
System.out.println(Thread.currentThread().getName()+"正在买第"+ticket+"张票");
Thread.sleep(1000);
ticket--;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class DemoMain { public static void main(String[] args) { TicketDemo t1= new TicketDemo(); //这个就是被共享的资源对象 //对个线程访问了同一个资源对象TicketDemo Thread t = new Thread(t1); t.start(); Thread t2 = new Thread(t1); t2.start(); } }
线程的生命周期
借鉴一张内存图(了解线程为什么会阻塞)当一个 线程得到了 “锁” 抢到了执行权 但是在执行的过程中 遇到Sleep进入睡眠状态 那么这个时候 其他的线程必须等该线程醒来后执行完程序归还“锁”后才能进行执行,所以在这段时间内其他的线程就进入了“阻塞”的状态
线程的实现原理