线程同步

来源:互联网 发布:八度网络空间 编辑:程序博客网 时间:2024/06/14 14:45

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

  

  

  

  

  

  

同步代码块

  

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

  

  

同步代码块格式:

  

  

  

  

  

同步方法

  

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

  

  

同步方法格式:

  

  

  

  

  

代码:

  

package com.siwuxie095.thread;

  

/**

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

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

*

* @author siwux

*

*/

  

class MyRunnableDemoimplements Runnable{

  

privateint ticket=5;

 

 

//复写 run() 方法

publicvoid 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 synchronizedvoid sync() {

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

if (ticket>0) {

try {

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

Thread.sleep(1000);

}catch (InterruptedException e) {

e.printStackTrace();

}

//车票越卖越少

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

}

}

}

  

public class ThreadSync {

  

public staticvoid 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】

0 0
原创粉丝点击