• java学习笔记 --- 多线程(线程安全问题——同步代码块)


    1、导致出现安全问题的原因:

      A:是否是多线程环境
      B:是否有共享数据
      C:是否有多条语句操作共享数据

    2、解决线程安全问题方法:

      同步代码块:
        synchronized(对象){
            需要同步的代码;
           }
      
       A:对象是什么呢?
          可以使任意对象。
       B:需要同步的代码是哪些呢?
          把多条语句操作共享数据的代码的部分给包起来
      
      注意:
      同步可以解决安全问题的根本原因就在那个对象上。该对象如同锁的功能。
      多个线程必须是同一把锁。

    3、同步的特点:
         前提:
          多个线程
        解决问题的时候要注意:
          多个线程使用的是同一个锁对象
        同步的好处
          同步的出现解决了多线程的安全问题。
        同步的弊端
          当线程相当多时,因为每个线程都会去判断同步上的锁,这是很耗费资源的,无形中会降低程序  的运行效率。

    4、其他说明

      A:同步代码块的锁对象是谁呢?
           任意对象。
      B:同步方法的格式及锁对象问题?
           把同步关键字加在方法上。
      
           同步方法是谁呢?
            this
      C:静态方法及锁对象问题?
           静态方法的锁对象是谁呢?
            类的字节码文件对象。

     public class SellTicket implements Runnable {
        // 定义100张票
        private int tickets = 100;
        //创建锁对象
        private Object obj = new Object();
    
            @Override
        public void run() {
            while (true) {
          //加入锁
    synchronized (obj) { if (tickets > 0) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "正在出售第" + (tickets--) + "张票"); } } } } } public class SellTicketDemo { public static void main(String[] args) { // 创建资源对象 SellTicket st = new SellTicket(); // 创建三个线程对象 Thread t1 = new Thread(st, "窗口1"); Thread t2 = new Thread(st, "窗口2"); Thread t3 = new Thread(st, "窗口3"); // 启动线程 t1.start(); t2.start(); t3.start(); } }
  • 相关阅读:
    【NLP】UnicodeDecodeError: 'ascii' codec can't decode byte 0xd1 in position 74752: ordinal not in rang
    【Android】Android学习过程中的一些网站
    【Java】第10章 内部类
    【Java】第7章 复用类
    【Linux】Ubuntu下安装QQ
    【Java】第9章 接口
    【Java】第8章 多态
    【Coding】用筛法求素数的C++实现(附100000以内素数表)
    【Android】挺好用的chart engine,可用于Android画饼图,条形图等
    【Coding】Visual Studio中最常用的13个快捷键
  • 原文地址:https://www.cnblogs.com/flei/p/6623112.html
Copyright © 2020-2023  润新知