java多线程基础
Posted IT编程之路
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java多线程基础相关的知识,希望对你有一定的参考价值。
上一篇说了一些多线程的概念和实现线程的两种方式,这一篇简单说一下实例变量与线程安全。
实例变量
自定义线程类中的实例变量针对其他线程可以有共享与不共享之分,这在多个线程之间进行交互时是很重要的一个技术点。
(1)不共享数据下图
我们用代码的形式实现数据不共享的情况。创建一个Java项目代码如下:线程类MyThread.java
运行类Run.java
运行结果
由图中代码看到一共创建了3个线程,每个线程都有各自的count变量,自己减少自己的count变量的值。这样的情况就是变量不共享,此示例并不存在多个线程访问同一个实例变量的情况。
如果想实现3个线程共同访问一个count变量进行减法操作的目的。
(2)共享数据下图
所谓的数据共享的情况就是多个线程可以访问同一个变量,比如在实现卖票功能的软件时,多个线程可以同时处理同一个车次的车票。下面通过代码实现
线程类MyThread.java
运行类Run.java
运行结果
在运行结果中看到所有的线程打印count值都是4,说明多个线程同时对count处理时,产生了“非线程安全”问题。我们想要的结果时打印的值不重复依次递减的。
在一些jvm中,i--的操作要分程3步:
1)取得原有i值;
2)计算i-1;
3)对i进行赋值;
在这3个步骤中,如果有多个线程同时访问,那么一定会出现非线程安全问题。如何实现count数量依次递减操作。这时就需要使多个线程之间进行同步,也就是用按顺序排队的方式进行递减操作。
修改代码
重新运行一下就不会出现值相同的运行结果
通过在run方法前加人synchronized关键字,使多个线程在执行run方法时,以排队的方式进行处理。当一个线程调用run前,先判断run方法有没有被上锁,如果上锁,说明有其他线程正在执行,必循等其他线程对run方法调用解说才可执行。这样就实现了排队的目的,达到count递减的效果了。synchronized可以在任意对象及方法上加锁,而加锁的这段代码称为“互斥区”或“临界区”。
当一个线程想要执行同步方法里面的代码时,线程首先尝试去拿这把锁,如果能够拿到锁,就可以执行synchronized里面的代码了。如果不能拿到锁,这个线程就会不断的尝试拿这把锁,直到能够拿到为止,并且时多个线程同时去抢这把锁。
以上是关于java多线程基础的主要内容,如果未能解决你的问题,请参考以下文章