zoukankan      html  css  js  c++  java
  • 线程基础学习

    线程安全概念:当多个线程访问某个类(对象或方法)时 , 这个类始终能表现出正确的行为 , 那么这个类(对象或方法)就是线程安全的。

    线程不安全:

     1 package com.itdoc.multi.sync001;
     2 
     3 /**
     4  * @author Wáng Chéng Dá
     5  * @create 2017-03-20 7:53
     6  */
     7 public class MyThread extends Thread {
     8 
     9     public int count = 5;
    10     @Override
    11     public void run() {
    12         count--;
    13         System.out.println(this.currentThread().getName() + " : count = " + count);
    14     }
    15 
    16     public static void main(String[] args) {
    17         MyThread myThread = new MyThread();
    18         Thread t1 = new Thread(myThread, "t1");
    19         Thread t2 = new Thread(myThread, "t2");
    20         Thread t3 = new Thread(myThread, "t3");
    21         Thread t4 = new Thread(myThread, "t4");
    22         Thread t5 = new Thread(myThread, "t5");
    23         t1.start();
    24         t2.start();
    25         t3.start();
    26         t4.start();
    27         t5.start();
    28     }
    29 }

    控制台输出:

    t2 : count = 3
    t3 : count = 2
    t1 : count = 3
    t4 : count = 1
    t5 : count = 0

    分析:因为线程不安全 , 在一个线程没有完成时 , 另一个线程也可以进入相同的方法 , 所以控制台打印输出会有不确定性。

    线程安全:

     1 package com.itdoc.multi.sync001;
     2 
     3 /**
     4  * 线程安全概念:当多个线程访问某一个类 (对象或方法) 时, 这个类 (对象或方法)始终都能表现出正确的行为, 
     5  * 那么这个类 (对象或方法) 就是线程安全的。
     6  * synchronized:可以在任意对象及方法上加锁, 而加锁的这段代码称为:"互斥区", "临界区"。
     7  *
     8  * @author Wáng Chéng Dá
     9  * @create 2017-03-20 7:53
    10  */
    11 public class MyThread extends Thread {
    12 
    13     public int count = 5;
    14     @Override
    15     public synchronized void run() {
    16         count--;
    17         System.out.println(this.currentThread().getName() + " : count = " + count);
    18     }
    19 
    20     public static void main(String[] args) {
    21         /**
    22          * 分析: 当多个线程访问 myThread 的 run 方法时, 以排队的方式进行处理。
    23          *
    24          * 一个线程若要调用 synchronized 修饰的方法中代码:
    25          * 1.尝试获取锁。
    26          * 2.若获取到锁, 执行 synchronized 修饰的方法中的代码。
    27          * 若没有获取到锁, 会不断尝试获取锁直到获取为止,而且过个线程会相互竞争这把锁。
    28          */
    29         MyThread myThread = new MyThread();
    30         Thread t1 = new Thread(myThread, "t1");
    31         Thread t2 = new Thread(myThread, "t2");
    32         Thread t3 = new Thread(myThread, "t3");
    33         Thread t4 = new Thread(myThread, "t4");
    34         Thread t5 = new Thread(myThread, "t5");
    35         t1.start();
    36         t2.start();
    37         t3.start();
    38         t4.start();
    39         t5.start();
    40     }
    41 }

    控制台输出:

    t1 : count = 4
    t2 : count = 3
    t4 : count = 2
    t3 : count = 1
    t5 : count = 0

    分析:多个线程访问 synchronized 修饰的方法时 , 若一个线程先获取锁 ,  只有这个线程执行完这段代码 , 释放锁之后 , 其余线程才可以获取到这把锁 , 他们是相互竞争关系。循环这种方式 , 直到所有线程执行结束。

  • 相关阅读:
    MapReduce数据连接
    STL笔记(2) STL之父访谈录
    Boost::Lexical_cast 的使用
    利用Python编写网络爬虫下载文章
    智普教育Python视频教程之入门基础篇,python笔记
    如何在windows下的Python开发工具IDLE里安装其他模块
    Windows命令行的使用
    Centos 开启telnet-service服务
    C,C++经典问题
    Linux/Unix C编程之的perror函数,strerror函数,errno
  • 原文地址:https://www.cnblogs.com/chinda/p/6585286.html
Copyright © 2011-2022 走看看