java线程几个重要概念(2)

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进入睡眠状态 那么这个时候 其他的线程必须等该线程醒来后执行完程序归还“锁”后才能进行执行,所以在这段时间内其他的线程就进入了“阻塞”的状态

 

线程的实现原理

坚持
原文地址:https://www.cnblogs.com/gaoSJ/p/12835594.html