线程同步

-----------siwuxie095

   

   

   

   

   

   

同步代码块

   

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

   

   

同步代码块格式:

   

   

   

   

   

同步方法

   

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

   

   

同步方法格式:

   

   

   

   

   

代码:

   

package com.siwuxie095.thread;

   

/**

* 同一辆车共 5 张车票,有 3 个售票窗口

* 3 个售票窗口即 3 个线程

*

* @author siwux

*

*/

   

class MyRunnableDemo implements Runnable{

   

private int ticket=5;

 

 

//复写 run() 方法

public void run() {

//循环次数超过 5 次即可,这里设为 10

for (int i = 0; i < 10; i++) {

 

//同步代码块:传入 this 即可

//如果没有同步代码块,则就会出现卖到 0 -1(注意:这里设置了 ticket>0 的条件)

//出现这种情况的原因就是资源无法共享。要解决类似的资源共享的问题就要用到同步

//设置同步后执行速度明显变慢,但是实现了资源共享

synchronized (this) {

//如果当前的车票大于0

if (ticket>0) {

try {

//票不会一下就卖光,设置买票等待时间 1

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

//车票越卖越少

System.out.println("车票:"+ticket--);

}

}

 

}

}

 

 

//同步方法:把需要同步的部分,放入该方法中即可

//在上面的 run()方法的for循环里调用该方法即可

//与同步代码块等效

public synchronized void sync() {

//如果当前的车票大于0

if (ticket>0) {

try {

//票不会一下就卖光,设置买票等待时间 1

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

//车票越卖越少

System.out.println("车票:"+ticket--);

}

}

}

   

public class ThreadSync {

   

public static void main(String[] args) {

   

MyRunnableDemo r=new MyRunnableDemo();

//3个窗口,创建 3 Thread对象

Thread t1=new Thread(r);

Thread t2=new Thread(r);

Thread t3=new Thread(r);

 

//启动 3 个线程,3 个窗口同时在卖票

t1.start();

t2.start();

t3.start();

 

}

   

}

   

   

运行一览:

   

使用同步:

   

   

   

未使用同步:

   

   

   

   

   

   

   

【made by siwuxie095】

原文地址:https://www.cnblogs.com/siwuxie095/p/6629548.html