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();
    }
    }

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

    死锁:

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

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

  • 相关阅读:
    此刻,很想那些老朋友
    985工程介绍
    211工程介绍
    蓝牙耳机声音断断续续
    不支持用淋浴洗澡
    在HY买饭
    成长路上的六个W
    屎、洗脚水
    Ubuntu更换软件源
    视频流媒体服务器RTMP和RTSP区别是什么?如何区分?
  • 原文地址:https://www.cnblogs.com/curedfisher/p/11975617.html
Copyright © 2011-2022 走看看