Java并发同步常用处理方法

怎甘沉沦 提交于 2020-04-24 01:51:11

synchronized jdk内置同步锁
synchronized同步互斥锁+通知等待模式
synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种:
1)修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;
2)修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;
3)修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;
4)修改一个类,其作用的范围是synchronized后面括号括起来的部分,作用主的对象是这个类的所有对象。

AQS同步组件
1)CountDownLatch:闭锁,通过计数来保证线程是否需要一直阻塞
2)Semaphore:控制同一时间并发线程的数目
3)CyclicBarrier:和CountDownLatch相似,都能阻阻塞线程
4)ReentrantLock
5)Condition
6)Future、FutureTask

进程间同步互斥

/**
 * 进程间同步(FileLock文件锁,同时开启多个进程实例,若已获得锁的实例在执行,则后面的进程实例均只能等待,当然可以使用tryLock非阻塞模式)
 */
private void testFileLock() {
    File lockFile = new File(System.getProperty("user.dir") + File.separator + "app.lock");
    if (!lockFile.exists()) {
        try {
            if (!lockFile.createNewFile()) {
                System.out.printf("创建文件失败:" + lockFile.getAbsolutePath());
                return;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    try {
        FileChannel fileChannel = new FileOutputStream(lockFile).getChannel();
        String jvmName = ManagementFactory.getRuntimeMXBean().getName();
        System.out.printf("jvm ProcessName:%s, 准备获取锁 ... %n", jvmName);
        FileLock lock = fileChannel.lock();//获取文件锁
        for (int i = 0; i <= 100; i++) {
            try {
                Thread.sleep(100L);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.printf("jvm ProcessName:%s, number:%d %n", jvmName, i);
        }
        lock.release();
        fileChannel.close();
        System.out.printf("jvm ProcessName:%s, 处理完成,释放锁 %n", jvmName);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

机器间同步互斥(即分布式锁)
1)基于DB实现(利用DB的更新独占锁)
2)基于Redis实现
    实现方式1(原生实现):Redis分布式锁的正确实现方式(Java版)
    实现方式2(Redlock):Redis分布式锁的官方算法RedLock以及Java版本实现库Redisson
3)基于Zookeeper实现
    实现示例: java同步系列之zookeeper分布式锁
 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!