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分布式锁
来源:oschina
链接:https://my.oschina.net/lion1220/blog/3569582