• 线程同步


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

  • 相关阅读:
    继承关系·
    对象第复制operator=
    关于类拷贝造函数
    静态数据成员与静态成员函数
    linux新内核的时钟机制代码
    RTC系统
    Android关机闹钟实现
    更改printk打印级别
    vncserver 配置全屏显示
    vnc里鼠标拖动终端就会产生ctrl+c终端
  • 原文地址:https://www.cnblogs.com/siwuxie095/p/6629548.html
Copyright © 2020-2023  润新知