同步与死锁
1、同步代码块
在代码块前面加上“synchronized”关键字,则此代码块称为同步代码块
2、同步代码块格式
synchronized(同步对象){
需要同步的代码块;
}
3、同步的方法
代码块可以同步,方法也是可以同步的
4、方法同步格式:
synchronized void 方法名称(){}
实例:三个窗口卖五张车票
不适用同步时的情况
package ThreadTest;
//三个窗口卖5张车票
class MyThreadDemo implements Runnable{
//五张车票
private int ticket=5;
public void run() {
for(int i=0;i<10;i++){
//当车票还有的时候,才会有人在排队买票
if(ticket>0){
try {
//买票等待时间,每个人等五百毫秒
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("车票"+ticket--);
}
}
}
}
public class ThreadDemo05 {
public static void main(String[] args) {
MyThreadDemo my=new MyThreadDemo();
//三个窗口创建三个线程对象
Thread t1=new Thread(my);
Thread t2=new Thread(my);
Thread t3=new Thread(my);
t1.start();
t2.start();
t3.start();
}
}
输出结果
车票5
车票5
车票5
车票4
车票3
车票2
车票1
车票-1
车票0
车票出现了负数,显然与事件不符,此时就是因为资源没法共享,没法同步导致的
那我们加入同步
package ThreadTest;
//三个窗口卖5张车票
class MyThreadDemo implements Runnable{
//五张车票
private int ticket=5;
public void run() {
for(int i=0;i<10;i++){
//加入同步
synchronized (this) {
//当车票还有的时候,才会有人在排队买票
if(ticket>0){
try {
//买票等待时间,每个人等五百毫秒
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("车票"+ticket--);
}
}
}
}
}
public class ThreadDemo05 {
public static void main(String[] args) {
MyThreadDemo my=new MyThreadDemo();
//三个窗口创建三个线程对象
Thread t1=new Thread(my);
Thread t2=new Thread(my);
Thread t3=new Thread(my);
t1.start();
t2.start();
t3.start();
}
}
输出结果
车票5
车票4
车票3
车票2
车票1
还可以使用同步方法
package ThreadTest;
//三个窗口卖5张车票
class MyThreadDemo implements Runnable{
//五张车票
private int ticket=5;
public void run() {
for(int i=0;i<10;i++){
//调用sell()方法
sell();
}
}
//加上同步方法
public synchronized void sell(){
//当车票还有的时候,才会有人在排队买票
if(ticket>0){
try {
//买票等待时间,每个人等五百毫秒
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("车票"+ticket--);
}
}
}
public class ThreadDemo05 {
public static void main(String[] args) {
MyThreadDemo my=new MyThreadDemo();
//三个窗口创建三个线程对象
Thread t1=new Thread(my);
Thread t2=new Thread(my);
Thread t3=new Thread(my);
t1.start();
t2.start();
t3.start();
}
}
输出结果:
车票5
车票4
车票3
车票2
车票1
死锁
举个例子:
死锁:毕业生找工作(高新)
企业需要你有经验才会给高新(经验),这两者互相冲突
解决这个问题的方法就是毕业生降低薪水预期,企业培养你经验