zoukankan      html  css  js  c++  java
  • 线程同步与死锁

    1.同步代码块

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

    2.同步代码块格式:

      synchronized(同步对象){

        需要同步的代码块;

      }

    3.同步方法

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

    4.方法同步格式:

      synchronized  void  方法名称(){}

    ========================================================

    ThreadDemo04.java

    package thread;
    /**
    * 5张车票,有3个窗口在卖(也就是说,3个窗口共享5张车票)
    * @author xjj13
    *
    */
    class MyThreadDemo implements Runnable{

    private int ticket=5;

    @Override
    public void run() {
    //循环超过5次就可以
    for (int i = 0; i < 10; i++) {
    if (ticket>0) {
    //卖票等待时间
    try {
    Thread.sleep(500);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    System.out.println("车票:"+ticket--);
    }
    }

    }

    }
    public class ThreadDemo05 {
    public static void main(String[] args) {
    //实例化demo
    MyThreadDemo m=new MyThreadDemo();
    //3个窗口
    Thread t1=new Thread(m);
    Thread t2=new Thread(m);
    Thread t3=new Thread(m);
    t1.start();
    t2.start();
    t3.start();
    }
    }

    运行结果出现负数:资源无法共享(解决资源共享问题需要用到同步,加synchronized关键字)

    ThreadDemo04.java

    package thread;
    /**
    * 5张车票,有3个窗口在卖(也就是说,3个窗口共享5张车票)
    * @author xjj13
    *
    */
    class MyThreadDemo implements Runnable{

    private int ticket=5;

    @Override
    public void run() {
    //循环超过5次就可以
    for (int i = 0; i < 10; i++) {
    //同步代码块
    synchronized (this) {
    //将需要执行的代码加入到同步方法中
    if (ticket>0) {
    //卖票等待时间
    try {
    Thread.sleep(500);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    System.out.println("车票:"+ticket--);
    }
    }

    }

    }

    }
    public class ThreadDemo05 {
    public static void main(String[] args) {
    //实例化demo
    MyThreadDemo m=new MyThreadDemo();
    //3个窗口
    Thread t1=new Thread(m);
    Thread t2=new Thread(m);
    Thread t3=new Thread(m);
    t1.start();
    t2.start();
    t3.start();
    }
    }

    执行截图:

     =================================================================

    同步方法:

    package thread;
    /**
    * 5张车票,有3个窗口在卖(也就是说,3个窗口共享5张车票)
    * @author xjj13
    *
    */
    class MyThreadDemo implements Runnable{

    private int ticket=5;

    @Override
    public void run() {
    //循环超过5次就可以
    for (int i = 0; i < 10; i++) {
    //循环当中调用同步方法
    tell();
    }

    }
    //同步方法
    public synchronized void tell() {
    //同步方法
    synchronized (this) {
    //将需要执行的代码加入到同步方法中
    if (ticket>0) {
    //卖票等待时间
    try {
    Thread.sleep(500);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    System.out.println("车票:"+ticket--);
    }
    }
    }
    }
    public class ThreadDemo05 {
    public static void main(String[] args) {
    //实例化demo
    MyThreadDemo m=new MyThreadDemo();
    //3个窗口
    Thread t1=new Thread(m);
    Thread t2=new Thread(m);
    Thread t3=new Thread(m);
    t1.start();
    t2.start();
    t3.start();
    }
    }

     ===================================================================

    死锁:

    学生找工作(高薪)
    企业需要你有工作经验(经验)

    这两者无法完成,这时候就是一个死锁状态,解决这种死锁状态只需要一方降低他的要求就可以了,比如:学生薪资降低,那么企业我录用你;或者我给你高薪,你缺经验我来培养你.

  • 相关阅读:
    2.NET Core设定数据库种子
    1.ASP.NET Core 中向 Razor Pages 应用添加模型
    获取文件夹目录下的文件信息
    dataGridView读写文本
    C# winform 启动外部程序
    netcore访问本地磁盘
    c#利用定时器自动备份数据库(mysql)
    c#mysql数据库备份还原
    Linux之旅(二)
    Linux之旅
  • 原文地址:https://www.cnblogs.com/curedfisher/p/11975617.html
Copyright © 2011-2022 走看看