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