第一篇博客——多线程编程模拟场景

这篇博客像一滴海水,我觉得互联网像一片海洋,一滴滴海水融合成了海洋,但海水在海洋中是普通的,或许当我写博客写的足够多时,可以将这些海水汇合到某个港湾,成为人们口中著名的某个港湾,或许我可以将这些海水汇合到某个海峡,人们会为这个海峡命名。海水晒干可以制成盐,这是对人有用的,海水为鱼儿们提供了生存的空间,在我看来互联网中的各种产品就像是海洋中的各种生物和植物,我是一个程序员,会开发出产品来填充互联网这片海洋,当然我们程序员这个群体,也都像这海洋中的一滴滴海水一样,文字代表着一个人的思想,戴尔卡耐基曾说过人活着就是活此时此刻的思想,所以就让我写的每一篇博客,代表着我融进这片海洋吧。
我接下来会分享一些我最近学到的知识,最近我学习了线程的一些知识,关于线程的学习有一个售票的例子,例子是这样的,若电影院上映《血战钢锯岭》,有三个窗口在售票,应该如何实现呢?可能你以为我接下来会贴一段代码,告诉你应该如何实现这个例子,没错,我会这样做,但在这之前我要告诉你更重要的一件事情,那就是怎样以一个软件开发工程师的角度去理解这个问题,JAVA是一种面向对象编程的语言,但是我们经常在面对一个场景的时候却不知道该如何应用面向对象编程的这种思想,直到我看到这句话:当在试图开发或理解一个程序设计时,最好的方法之一就是将对象相像为“服务提供者”。程序本身将向用户提供服务,它将通过调用其他对象提供的服务来实现这一目的。你的目标就是去创建(或者最好是在现有代码库中寻找)能够提供理想的服务来解决问题的一系列对象。以这样的思想去理解这个应用场景时,就能得出一个窗口的对象,如果是三个窗口同时售卖电影票,通过Java中的多线程就可以实现,以下是窗口对象的代码:

public class RunnableSellWindow implements Runnable { 

int tickets=100;

@Override
public void run(){

	//TODOAuto-generatedmethodstub

	while(tickets>0){
		
		System.out.println(getName()+"已售出第"+tickets--+"张票");
	}

}
}

我们通过实现Thread类或者实现Runnable接口的方式进行多线程编程,根据现在程序编写的情况,选择以下这种方式实现多线程

    RunnableSellWindow runnableSellWindow = new RunnableSellWindow();
	
	new Thread(runnableSellWindow).start();
	new Thread(runnableSellWindow).start();
	new Thread(runnableSellWindow).start();
	}

如果这样运行程序,很有可能出现两个窗口同时售卖一张票的情况,

堆:也叫作运行时数据区,线程共享在JVM运行过程中创建的对象和产生的数据都被存储在堆中,堆是被线程共享的内存区域,也是垃圾收集器进行垃圾回收的最主要的内存区域。由于现代JVM采用分代收集算法,因此Java堆从GC(GarbageCollection,垃圾回收)的角度还可以细分为:新生代、老年代和永久代。

由于在JVM运行过程中创建的对象和产生的数据都被存储在堆中,堆是被线程共享的内存区域,所以需要使用到Java多线程中的锁来为该对象:

Java中的锁
Java中的锁Java中的锁主要用于保障多并发线程情况下数据的一致性。在多线程编程中为了保障数据的一致性,我们通常需要在使用对象或者方法之前加锁,这时如果有其他线程也需要使用该对象或者该方法,则首先要获得锁,如果某个线程发现锁正在被其他线程使用,就会进入阻塞队列等待锁的释放,直到其他线程执行完成并释放锁,该线程才有机会再次获取锁进行操作。这样就保障了在同一时刻只有一个线程持有该对象的锁并修改对象,从而保障数据的安全。锁从乐观和悲观的角度可分为乐观锁和悲观锁,从获取资源的公平性角度可分为公平锁和非公平锁,从是否共享资源的角度可分为共享锁和独占锁,从锁的状态的角度可分为偏向锁、轻量级锁和重量级锁。同时,在JVM中还巧妙设计了自旋锁以更快地使用CPU资源。下面将详细介绍这些锁。

Java中的锁Java中的锁主要用于保障多并发线程情况下数据的一致性。在多线程编程中为了保障数据的一致性,我们通常需要在使用对象或者方法之前加锁,这时如果有其他线程也需要使用该对象或者该方法,则首先要获得锁,如果某个线程发现锁正在被其他线程使用,就会进入阻塞队列等待锁的释放,直到其他线程执行完成并释放锁,该线程才有机会再次获取锁进行操作。这样就保障了在同一时刻只有一个线程持有该对象的锁并修改对象,从而保障数据的安全。这里我们实现给代码片加锁的代码如下:
`

    @Override  
    public void run() {
	// TODO Auto-generated method stub
	
	String lockA = "lockA";
	
	while (tickets > 0) {
		try {
			synchronized (lockA) {
			System.out.println(Thread.currentThread().getName() + "已售出第" + tickets-- + "张票");
			Thread.sleep(100);	
			}
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		}
	}
	`
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值