前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Apache-Ignite入门实战之三 - 分布式锁

Apache-Ignite入门实战之三 - 分布式锁

作者头像
kongxx
发布2018-05-14 13:56:09
1.6K0
发布2018-05-14 13:56:09
举报

在 Ignite 的分布式缓存中还有一种常见应用场景是分布式锁,利用分布式锁我们可以实现简单的集群master选举功能。

下面是一个使用分布式锁的例子:

代码语言:javascript
复制
package my.ignitestudy.datagrid;

import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteCache;
import org.apache.ignite.Ignition;
import org.apache.ignite.cache.CacheAtomicityMode;
import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;

import java.util.Arrays;
import java.util.concurrent.locks.Lock;

public class DistributedLockExample {

    public static void main( String[] args ) throws Exception {
        test();
    }

    private static Ignite getIgnite() {
        TcpDiscoverySpi spi = new TcpDiscoverySpi();
        TcpDiscoveryVmIpFinder ipFinder = new TcpDiscoveryVmIpFinder();
        ipFinder.setAddresses(Arrays.asList("192.168.0.192:47500..47509"));
        spi.setIpFinder(ipFinder);

        IgniteConfiguration igniteCfg = new IgniteConfiguration();
        igniteCfg.setDiscoverySpi(spi);
        igniteCfg.setClientMode(true);

        Ignite ignite = Ignition.start(igniteCfg);
        return ignite;
    }

    private static void test() throws Exception {
        CacheConfiguration cacheCfg = new CacheConfiguration();
        cacheCfg.setName("default");
        cacheCfg.setBackups(1);
        IgniteCache<String, String> cache = getIgnite().getOrCreateCache(cacheCfg);

        String mylock = "mylock";

        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("Thread 1: before lock");
                Lock lock = cache.lock(mylock);
                lock.lock();
                System.out.println("Thread 1: after lock");

                try {
                    cache.put(mylock, "Thread 1");
                    Thread.currentThread().sleep(10 * 1000);
                } catch (Exception ex) {
                    ex.printStackTrace();
                } finally {
                    System.out.println("Thread 1: before unlock");
                    lock.unlock();
                    System.out.println("Thread 1: after unlock");
                }
            }
        }).start();

        Thread.currentThread().sleep(2 * 1000);

        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("Thread 2: before lock");
                Lock lock = cache.lock(mylock);
                lock.lock();
                System.out.println("Thread 2: after lock");

                try {
                    cache.put(mylock, "Thread 2");
                } catch (Exception ex) {
                    ex.printStackTrace();
                } finally {
                    System.out.println("Thread 2: before unlock");
                    lock.unlock();
                    System.out.println("Thread 2: after unlock");
                }
            }
        }).start();
    }

}
  • 例子中使用两个线程来模拟抢占锁的场景。
  • 为了测试方便,第一个线程先启动,在获取锁后先sleep一会,等待第二个线程启动。
  • 第二个线程启动后也试着去获取锁,此时由于第一个线程已经获取了锁,所以第二个线程会等待。
  • 第一个线程sleep一会后,把锁释放,这时第二个线程就会立即获取锁,然后执行自己的逻辑。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.12.28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档