zoukankan      html  css  js  c++  java
  • java多线程介绍(二)

    线程安全问题:

    产生线程安全的原因:

    1、存在多线程;

    2、多个线程操作同一个共享资源;

    3、有多行操作共享资源的语句。

    解决方案:

    使用同步代码解决(synchronized)

    package cn.itcast.thread;
    
    class SaleTickets extends Thread {
        static int num = 50;
        public SaleTickets(String name) {
            super(name);
        }
    
        @Override
        public void run() {
            while(true) {
                synchronized ("Lock") {
                    if(num > 0) {
                      System.out.println(currentThread().getName() + "售出了" + num-- +"号票。");
                    } else {
                        System.out.println("售罄了。");
                        break;
                    }
                }
          }
        }
    
    }
    
    public class Demo3 {
        public static void main(String[] args) {
            SaleTickets thread1 = new SaleTickets("窗口1");
            thread1.start();
            SaleTickets thread2 = new SaleTickets("窗口2");
            thread2.start();
            SaleTickets thread3 = new SaleTickets("窗口3");
            thread3.start();
        }
    }

    如果使用同步函数需要注意:

    1、非静态同步函数的锁对象是this,静态函数的锁对象是当前所属类的字节码文件(class对象);

    2、同步函数的锁对象是固定的,不能由程序制定。

    推荐使用同步代码块,原因:

    1、同步代码块的锁对象由开发人员制定,方便控制;

    2、同步代码块可以方便的控制同步代码的范围,而同步函数必须是整个函数的所有代码都被同步。

    死锁:java同步机制解决了线程安全问题,也同时引发了死锁问题

    如下代码会造成死锁现象

    package cn.itcast.thread;
    /*java同步机制解决了线程安全问题,也同时引发了死锁问题*/
    
    class DeadLock extends Thread {
    
        public DeadLock(String name) {
            super(name);
        }
    
        @Override
        public void run() {
            if ("张三".equals(currentThread().getName())) {
                synchronized ("遥控器") {
                    System.out.println("张三拿到了遥控器,准备去电池");
                    synchronized ("电池") {
                        System.out.println("张三拿到了电池,可以开空调了");
                    }
                }
            }
            if ("李四".equals(currentThread().getName())) {
                synchronized ("电池") {
                    System.out.println("李四拿到了电池,准备去拿遥控器");
                    synchronized ("遥控器") {
                        System.out.println("李四拿到了遥控器,可以开空调了");
                    }
                }
            }
        }
    }
    
    public class Demo5 {
    
        public static void main(String[] args) {
            DeadLock thread1 = new DeadLock("张三");
            DeadLock thread2 = new DeadLock("李四");
            thread1.start();
            thread2.start();
        }
    
    }

    出现死锁的原因:

    1、存在多线程;

    2、存在多个(两个或以上)共享资源。

    死锁没有具体的解决方案,只能在开发过程中避免死锁的出现!!!

  • 相关阅读:
    [转]托管DirectX,从MDX到SlimDX的转换
    [连载]Tutorial series: learning how to write a 3D soft engine from scratch in C#, TypeScript or JavaScript[英]
    关于VS2010 C#使用DirectX的问题[英]
    C#调试含有源代码的动态链接库遇见there is no source code available for the current location提示时的解决方案
    C#常用控件缩写
    朴素贝叶斯
    scikit-learn 入门
    机器学习(6): 层次聚类 hierarchical clustering
    机器学习(5): K-means 算法
    机器学习(4): KNN 算法
  • 原文地址:https://www.cnblogs.com/running-fish/p/9473052.html
Copyright © 2011-2022 走看看