一起Talk Android吧(第三百六十三回:多线程之线程同步)
Posted talk_8
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一起Talk Android吧(第三百六十三回:多线程之线程同步)相关的知识,希望对你有一定的参考价值。
各位看官们,大家好,上一回中咱们说的是android中多线程之线程中断的例子,这一回中咱们介绍的例子是多线程之线程同步。闲话休提,言归正转。让我们一起Talk Android吧!
程序中引入多线程后就需要考虑访问共享资源的问题,例如两个线程同时访问一个变量时它们获取到的变量值不一定相同,在这个例子中变量就是一种共享资源,为了保证两个或者多个线程访问共享资源时获取到相同的值,我们需要使用相关的技术,这个技术是线程同步。
线程同步技术中经常使用的例子是生产者与消费者模型,我们通过文字来做简单的说明:工厂同时生产和出售(当作消费)商品,商品就是共享资源,生产者和消费者操作商品时需要保证它们拿到的商品数量相同,比如生产者生产了5件商品,消费者却卖了6件商品,这多出来的1件商品是哪里生产的?显然生产者与消费者在操作商品这个共享资源时出现了不一致,接下来我们通过具体的代码来演示。
public class ThreadLock
public static void main(String[] args)
// 不进行任何同步操作
class ProducerAndCustomer
//定义变量当作共享资源
private int criticalResource;
public ProducerAndCustomer()
criticalResource = 0;
//定义方法模拟生产者的生产动作
public void produce()
criticalResource += 1;
System.out.println("produce finished CriticalResource : "+criticalResource);
//定义方法模拟消费者的消费动作
public void consume()
System.out.println("consume finished CriticalResource : "+criticalResource);
criticalResource -= 1;
ProducerAndCustomer obj = new ProducerAndCustomer();
//生产者开始生产
new Thread(()->
for (int i=0; i<3; i++)
obj.produce();
,"Produce: ").start();
//消费者开始消费
new Thread(()->
for (int i=0; i<3; i++)
obj.consume();
,"Consume: ").start();
在上面的程序中, 我们定义了生产者与消费者类,在类中通过类的成员变量和成员方法来模拟商品、生产和消费动作。在主线程中创建类的对象并且对商品进行生产和消费。这些内容在代码中都有注释以方便大家理解程序,编译并且运行上面的程序可以得到以下结果:
consume finished CriticalResource : 1
consume finished CriticalResource : 0
consume finished CriticalResource : -1
produce finished CriticalResource : 1
produce finished CriticalResource : -1
produce finished CriticalResource : 0
大家的运行结果可能和上面的结果不同,我在不同时间运行程序时也会得到不同的结果,这是线程调度引起的,大家不要以为程序运行出错了。
从程序的运行结果中可以看到,生产者和消费者第一次生产和消费时商品数量为1,这是正常的,但是第二次和第三次生产和消费时他们各自获取到的商品数量不一样。我们通过程序模拟出了多个线程访问共享资源时出现共享资源不一致的问题,这种问题在实际中是不允许发生的,如何解决此问题呢?引入线程同步技术就可以,我们将在下一章回中将介绍线程同步技术,敬请期待!
看官们,关于Android中多线程之线程同步的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!
以上是关于一起Talk Android吧(第三百六十三回:多线程之线程同步)的主要内容,如果未能解决你的问题,请参考以下文章
一起Talk Android吧(第四百六十三回:自定义属性)
一起Talk Android吧(第三百零三回:EditText限制输入)
一起Talk Android吧(第三百四十三回: Android网络编程总结)
一起Talk Android吧(第三百八十三回:视图绑定-ViewBinding)