zoukankan      html  css  js  c++  java
  • 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(); } }
  • 相关阅读:
    20145202 《信息安全系统设计基础》课程总结
    20145234黄斐《网络对抗技术》实验六-信息搜集与漏洞扫描
    20145234黄斐《Java程序设计》实验二—Java面向对象程序设计
    20145234黄斐《Java程序设计》第九周
    20145234黄斐《网络对抗技术》实验五,MSF基础应用
    20145234黄斐《Java程序设计》第八周
    20145234黄斐《Java程序设计》实验一—Java开发环境的熟悉(Linux + Eclipse)
    20145234黄斐《Java程序设计》第七周
    20145234黄斐《网络对抗技术》实验四,恶意代码分析
    20145234黄斐《java程序设计》第六周
  • 原文地址:https://www.cnblogs.com/flei/p/6623112.html
Copyright © 2011-2022 走看看