嵌入式软件,JAVA,Zookeeper中的资源共享的问题

最近在学习大数据的相关知识,环境搭建了,mapreduce程序也写过了,HIVE,sqoop等组件也都安装,并进行了测试,但是总是感觉有写不踏实,必进对于一枚嵌入式工程师来说,大数据的知识总是有一些遥不可及。终于在有一天看到了分布式共享锁的问题,想想恰好在FREERTOS中也有资源共享的问题,而JAVA的多进程实现中也有资源同步的问题,于是闲来无事,写了这篇文章,看看这些资源共享和同步中都有哪些区别;水平有限,理解的不够,还望大神们拍砖;

买票的问题:
汽车站售卖车票,车票数量是一定的,但是售票口很多,那么车票就是共享的资源,售票口就是I/O,如何保证所有的售票口都能够正确的卖出票,而且不出错,就需要对车票资源进行保护。JAVA工程师,看到这样的问题会如何处理。其实很简单一个同步关键字synchronized,就可以解决。
可以创建几个进程模拟买票,然后将买票的动作进行同步,这样就实现了买票资源的同步,确保买票的正确性;程序可以如下所示:
package com.javatest.thread.p3;
public class TicketThreadTest {
private static int tickets = 5;
public static void main(String[] args) {
final TS ts = new TS();
Thread t1 = new Thread(){
public void run(){
ts.SellTicket();
}
};
Thread t2 = new Thread(){
public void run(){
ts.SellTicket();
}
};
Thread t3 = new Thread(){
public void run(){
ts.SellTicket();
}
};
t3.start();
t1.start();
t2.start();
}
static class TS{
public void SellTicket(){
Thread t = Thread.currentThread();
for(int i=0;i<100;i++){
synchronized (this) { //同步代码块
if(tickets >0)
{
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(t+"sellint "+tickets–);
}
}
}
}
}
}
而对于熟悉FreeRTOS的嵌入式工程师来说,可以通过计数型信号量的问题来解决这个问题。每一个买票窗口可以相当于创建的一个任务,他们都和同一个变量(票数)操作,每卖出一张票变量减1,退会一张票加1。使用信号量操作,当一个任务的信号量没有被释放的时候,其他的任务是不能获得信号量而进行加一或减一操作的。这里默认每一个窗口的优先级是一样的。而如果窗口任务的优先级有区别时候,就需要使用互斥信号量,让信号量的优先级继承任务的优先级,保证任务的正常运行。当然,还需要在共用变量前面加上volatile,保证每一次的存取都是直接对变量的操作。
上面所说的都是在单机情况下,如果在分布式系统中,该如何保证每一个票的窗口都是能够卖出正确的票。比如说火车票。各个地方的购票窗口就相当于是分布式节点来获取公共的火车票资源。(如下的分析只是臆想,不一定对,哈哈)要解决这个问题,可以使用zookeeper中的分布式共享锁的问题,可以在数据库(票)前段加上一个共享锁,所有的窗口需要对数据库进行操作的时候都需要获取锁。而操作结束后会将获取的锁给到下一个窗口,保证所有的窗口都能够正确的卖票。获得锁的规则可以软件定义,比如那个窗口创建了最小的节点获取锁。
一点点小的看法,只是在学习中发现了一些相关性,写出来和大家交流。

你可能感兴趣的:(嵌入式软件,JAVA,Zookeeper中的资源共享的问题)