多线程之同步和死锁

时间:2021-10-20 18:30:03
在多线程的开发中, 同步与死锁的概念非常重要


我需要知道的是 那里需要同步 
                如何实现同步 代码了解即可

以及实现同步之后 有哪些副作用

接下来以买火车票为例

package ThreadTest;
class Tong implements Runnable{
private int ticket=5;
public void run() {

for (int i = 0; i < 100; i++) {
if (ticket>0) {//还有票
try {
Thread.sleep(1000);//加入yanchi
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("卖票:ticket="+ticket--);
}
}
}

}

public class TongBuDemo {
public static void main(String[] args) {
Tong tong=new Tong();//定义线程对象
Thread t1=new Thread(tong);//定义Thread实例
Thread t2=new Thread(tong);
Thread t3=new Thread(tong);
t1.start();
t2.start();
t3.start();
}


}
多线程之同步和死锁
出现了负数  说明那个地方出错了 相信大家 也看了 这个程序分为两个步骤

多线程之同步和死锁


这时候就需要用同步代码块 同步就是指:多个操作在同一个时间段内只能有一个线程

其他线程只有等这个线程技术才能执行


代码块上加入synchronized关键字 就是同步代码块


package ThreadTest;
class Tong implements Runnable{
private int ticket=5;
public void run() {

for (int i = 0; i < 100; i++) {
synchronized (this) {//要对当前对象进行同步
if (ticket>0) {//还有票
try {
Thread.sleep(1000);//加入yanchi
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("卖票:ticket="+ticket--);
}
}

}
}

}

public class TongBuDemo {
public static void main(String[] args) {
Tong tong=new Tong();//定义线程对象
Thread t1=new Thread(tong);//定义Thread实例
Thread t2=new Thread(tong);
Thread t3=new Thread(tong);
t1.start();
t2.start();
t3.start();
}


}

这样大家都看的出效率降低了好多
还有一种方法  synchronized关键字将一个方法声明成同步方法
synchronized 方法返回值 方法名称(参数列表){}


package ThreadTest;
class Tong implements Runnable{
private int ticket=5;
public void run() {

for (int i = 0; i < 100; i++) {
//synchronized (this) {//要对当前对象进行同步

this.sale();



}
}
private synchronized void sale() {
if (ticket>0) {//还有票
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("卖票:ticket="+ticket--);
}
}

}

public class TongBuDemo {
public static void main(String[] args) {
Tong tong=new Tong();//定义线程对象
Thread t1=new Thread(tong);//定义Thread实例
Thread t2=new Thread(tong);
Thread t3=new Thread(tong);
t1.start();
t2.start();
t3.start();
}


}