线程同步与死锁

1.同步代码块

  在代码块上加上"synchronized"关键字,则此代码块就称为同步代码块

2.同步代码块格式:

  synchronized(同步对象){

    需要同步的代码块;

  }

3.同步方法

  除了代码块可以同步,方法也可以同步的

4.方法同步格式:

  synchronized  void  方法名称(){}

========================================================

ThreadDemo04.java

package thread;
/**
* 5张车票,有3个窗口在卖(也就是说,3个窗口共享5张车票)
* @author xjj13
*
*/
class MyThreadDemo implements Runnable{

private int ticket=5;

@Override
public void run() {
//循环超过5次就可以
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) {
//实例化demo
MyThreadDemo m=new MyThreadDemo();
//3个窗口
Thread t1=new Thread(m);
Thread t2=new Thread(m);
Thread t3=new Thread(m);
t1.start();
t2.start();
t3.start();
}
}

运行结果出现负数:资源无法共享(解决资源共享问题需要用到同步,加synchronized关键字)

ThreadDemo04.java

package thread;
/**
* 5张车票,有3个窗口在卖(也就是说,3个窗口共享5张车票)
* @author xjj13
*
*/
class MyThreadDemo implements Runnable{

private int ticket=5;

@Override
public void run() {
//循环超过5次就可以
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) {
//实例化demo
MyThreadDemo m=new MyThreadDemo();
//3个窗口
Thread t1=new Thread(m);
Thread t2=new Thread(m);
Thread t3=new Thread(m);
t1.start();
t2.start();
t3.start();
}
}

执行截图:

 =================================================================

同步方法:

package thread;
/**
* 5张车票,有3个窗口在卖(也就是说,3个窗口共享5张车票)
* @author xjj13
*
*/
class MyThreadDemo implements Runnable{

private int ticket=5;

@Override
public void run() {
//循环超过5次就可以
for (int i = 0; i < 10; i++) {
//循环当中调用同步方法
tell();
}

}
//同步方法
public synchronized void tell() {
//同步方法
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) {
//实例化demo
MyThreadDemo m=new MyThreadDemo();
//3个窗口
Thread t1=new Thread(m);
Thread t2=new Thread(m);
Thread t3=new Thread(m);
t1.start();
t2.start();
t3.start();
}
}

 ===================================================================

死锁:

学生找工作(高薪)
企业需要你有工作经验(经验)

这两者无法完成,这时候就是一个死锁状态,解决这种死锁状态只需要一方降低他的要求就可以了,比如:学生薪资降低,那么企业我录用你;或者我给你高薪,你缺经验我来培养你.

原文地址:https://www.cnblogs.com/curedfisher/p/11975617.html