线程同步
1.同步代码块
在代码块上“synchronized”关键字,则此代码块就称为同步代码块
2.同步代码块格式
synchronized(同步对象){
需要同步的代码;
}
3.同步方法
除了代码块可以同步,方法也是可以同步的
4.方法同步格式
synchronized void 方法名称(){}
//没加同步的时候
public class MyThread implements Runnable{
private int ticket=5;
public void run(){
for(int i=0;i<10;i++){
System.out.println("车票:"+ticket--);
}
}
}
//测试
public class ThreadTest{
public static void main(String[] args){
MyThread mt=new MyThread();
Thread t1=new Thread(mt);
Thread t2=new Thread(mt);
Thread t3=new Thread(mt);
t1.start();
t2.start();
t3.start();
}
}
//加同步代码块之后
public class MyThread implements Runnable{
private int ticket=5;
public void run(){
for(int i=0;i<10;i++){
synchronized(this){
if(ticket > 0){
try{
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println("车票:"+ticket--);
}
}
}
}
}
//加同步方法
public void run(){
for(int i=0;i<10;i++){
tell();
}
}
public synchonized void tell(){
if(ticket > 0){
try{
Thread.sleep(500);
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println("车票:"+ticket--);
}
}
生命周期
suspend()线程暂时挂起, resume()线程恢复运行, wait()暂停
此三个方法容易引起死锁