美文网首页
线程学习记录01-什么是线程安全

线程学习记录01-什么是线程安全

作者: 绝世懒人 | 来源:发表于2017-06-21 11:07 被阅读0次

线程安全概念:当多个线程访问某个类(对象或方法)时,这个类始终都能表现出正确的行为,那么这个类就是线程安全的。
synchronized:可以在任意对象及方法上加锁,而加锁的这段代码称为“互斥区” 或“临界区”

示例:

public class MyThread extends Thread {

private int count = 5 ;

@Override
public void run() {
    count -- ;
    System.out.println(this.currentThread().getName() + ": count is " + count);
}

public static void main(String[] args) {
    MyThread myThread = new MyThread();
    Thread t1 = new Thread(myThread, "t1");
    Thread t2 = new Thread(myThread, "t2");
    Thread t3 = new Thread(myThread, "t3");
    Thread t4 = new Thread(myThread, "t4");
    Thread t5 = new Thread(myThread, "t5");
    t1.start();
    t2.start();
    t3.start();
    t4.start();
    t5.start();
}}

如上代码,方法上我们并没有加锁。同时运行5个线程,期望count能够按照我们预期的依次递减。但是结果如下

image.png

其中并没有按照我们预期中的进行递减,这是因为当多个线程访问MyThread的run方法时,是以CPU分配的先后顺序进行的,并不是按照代码的先后顺序。所以很有可能当某段代码还没执行完,CPU就把这个资源分配给其他线程了,导致共享变量的错乱。
因此,做出如下修改:

public class MyThread extends Thread {

private int count = 5 ;

@Override
public synchronized void run() {
    count -- ;
    System.out.println(this.currentThread().getName() + ": count is " + count);
}

public static void main(String[] args) {
    MyThread myThread = new MyThread();
    Thread t1 = new Thread(myThread, "t1");
    Thread t2 = new Thread(myThread, "t2");
    Thread t3 = new Thread(myThread, "t3");
    Thread t4 = new Thread(myThread, "t4");
    Thread t5 = new Thread(myThread, "t5");
    t1.start();
    t2.start();
    t3.start();
    t4.start();
    t5.start();
}}
image.png

在run方法上加上synchronize,使其成为一段互斥的代码。当线程尝试执行synchronize修的代码时,会先去尝试获取锁,拿到锁则执行代码。拿不到则会不断的尝试获取这把锁,直到拿到为止,而且是多个线程同时去竞争这把锁(比如1000个线程,只有一个线程能拿到锁,其他999个线程去竞争,对我们CPU的压力就比较大了,应该尽量避免)

相关文章

  • 线程学习记录01-什么是线程安全

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

  • atomic & nonatomic

    什么是线程安全??? 线程安全:多线程操作共享数据不会出现想不到的结果就是线程安全的,否则,是线程不安全的。 at...

  • 线程不安全?

    1、什么是线程不安全? 线程安全是java学习中的重点,了解哪些情况下线程不安全,可让初学者更好的理解 线...

  • 58(5.3)

    53分钟。 线程和进程区别 Java的线程安全 什么是线程安全,如何保障。哪些变量是线程安全。 Java IO 分...

  • iOS-线程安全探究

    为什么CFRunLoopRef是线程安全的,而基于此的NSRunLoop却不是线程安全的呢? 线程安全时多线程领域...

  • Java 多线程 - CAS

    前言 记录在学习线程安全知识点中,关于CAS的有关知识点。 线程安全是指:多个线程不管以何种方式访问某个类,并且在...

  • 多线程通信简介

    这里是对学习的多线程通信做个记录.之前也对多线程安全 以及 Android 中多线程通信进行了接受,可以前往查看...

  • Java死磕多线程(volatile)

    前言 当我们再使用多线程的时候经常会碰到一些线程安全的问题,什么是线程安全、什么是线程锁。为什么需要用到线程锁?接...

  • Java多线程

    目录 什么是多线程?引入多线程的意义何在? 并行和并发 线程安全 线程状态 如何保证线程安全? 创建线程的三种方法...

  • 2.1synchronized同步方法

    “线程安全”与“非线程安全”相关的技术点,它们是学习多线程技术时一定会遇到的经典问题。“非线程安全”其实会在多个线...

网友评论

      本文标题:线程学习记录01-什么是线程安全

      本文链接:https://www.haomeiwen.com/subject/xymzqxtx.html