java多线程基础

Posted IT编程之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java多线程基础相关的知识,希望对你有一定的参考价值。

上一篇说了一些多线程的概念和实现线程的两种方式,这一篇简单说一下实例变量与线程安全。

实例变量

自定义线程类中的实例变量针对其他线程可以有共享与不共享之分,这在多个线程之间进行交互时是很重要的一个技术点。

(1)不共享数据下图

我们用代码的形式实现数据不共享的情况。创建一个Java项目代码如下:线程类MyThread.java

java多线程基础(二)

运行类Run.java

java多线程基础(二)

运行结果

java多线程基础(二)

由图中代码看到一共创建了3个线程,每个线程都有各自的count变量,自己减少自己的count变量的值。这样的情况就是变量不共享,此示例并不存在多个线程访问同一个实例变量的情况。

如果想实现3个线程共同访问一个count变量进行减法操作的目的。

(2)共享数据下图

java多线程基础(二)

所谓的数据共享的情况就是多个线程可以访问同一个变量,比如在实现卖票功能的软件时,多个线程可以同时处理同一个车次的车票。下面通过代码实现

线程类MyThread.java

java多线程基础(二)

运行类Run.java

java多线程基础(二)

运行结果

java多线程基础(二)

在运行结果中看到所有的线程打印count值都是4,说明多个线程同时对count处理时,产生了“非线程安全”问题。我们想要的结果时打印的值不重复依次递减的。

在一些jvm中,i--的操作要分程3步:

1)取得原有i值;

2)计算i-1;

3)对i进行赋值;

在这3个步骤中,如果有多个线程同时访问,那么一定会出现非线程安全问题。如何实现count数量依次递减操作。这时就需要使多个线程之间进行同步,也就是用按顺序排队的方式进行递减操作。

修改代码

java多线程基础(二)

重新运行一下就不会出现值相同的运行结果

通过在run方法前加人synchronized关键字,使多个线程在执行run方法时,以排队的方式进行处理。当一个线程调用run前,先判断run方法有没有被上锁,如果上锁,说明有其他线程正在执行,必循等其他线程对run方法调用解说才可执行。这样就实现了排队的目的,达到count递减的效果了。synchronized可以在任意对象及方法上加锁,而加锁的这段代码称为“互斥区”或“临界区”。

当一个线程想要执行同步方法里面的代码时,线程首先尝试去拿这把锁,如果能够拿到锁,就可以执行synchronized里面的代码了。如果不能拿到锁,这个线程就会不断的尝试拿这把锁,直到能够拿到为止,并且时多个线程同时去抢这把锁。


以上是关于java多线程基础的主要内容,如果未能解决你的问题,请参考以下文章

Java 多线程基础多线程的实现方式

Java多线程基础

温故Java基础多线程编程—线程安全

JAVA多线程和并发基础面试问答

java 基础学习:多线程04

Java多线程多线程基础