锁、无锁、分布式锁实现全局唯一性ID
JVM锁:对象、偏向、公平、重入、死锁
分布式锁:数据库、nosql、zookeeper
无锁线程代码实例
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class NoLockOrder {
public static void main(String[]args){
ExecutorService executorService = Executors.newCachedThreadPool();
final CountDownLatch latch = new CountDownLatch(1);
for(int i = 0; i < 10 ; i++){
executorService.submit(new Runnable() {
@Override
public void run() {
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.printf("线程名%s订单好:%s\r\n", Thread.currentThread().getName(), getOrderNo());
}
});
}
latch.countDown();
executorService.shutdown();
}
static int number = 0;
synchronized public static String getOrderNo(){
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("YYYYMMDDHHMMSS");
return simpleDateFormat.format(new Date()) + (number++ + "");
}
}
类锁:一个OrderLockServer.class
对象锁:orderServer、orderServer1、orderServer2
实例:通过对象放置位置的不同和继承抽象方法的重写是否实现来对比下类锁与对象锁的执行结果,看是否会出现重复
OrderServer 接口
public interface OrderServer {
/**
* 生成订单号
* @return
*/
public String getOrderNo();
}
AbstractOrderServer抽象类
import java.text.SimpleDateFormat;
import java.util.Date;
public class AbstractOrderServer implements OrderServer {
static int number = 0;
public static synchronized String getOrderNo2(){
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("YYYYMMDDHHMMSS");
return simpleDateFormat.format(new Date()) + number++;
}
@Override
public String getOrderNo() {
return getOrderNo2();
}
}
OrderLockServer 继承抽象类
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* jvm级别的锁
*/
public class OrderLockServer extends AbstractOrderServer{
// 注释掉的话,会执行抽象类里面的getOrderNo2类方法,否则执行该类重写的方法
// static int number = 0;
// public String getOrderNo(){
// SimpleDateFormat simpleDateFormat = new SimpleDateFormat("YYYYMMDDHHMMSS");
// return simpleDateFormat.format(new Date()) + number++;
// }
}
OrderTask线程类
import java.util.concurrent.CountDownLatch;
public class OrderTask implements Runnable {
private CountDownLatch latch;
private OrderServer orderServer;
public OrderTask(CountDownLatch latch, OrderServer orderServer){
this.latch = latch;
this.orderServer = orderServer;
}
@Override
public void run() {
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.printf("线程名%s订单好:%s\r\n", Thread.currentThread().getName(), orderServer.getOrderNo());
}
}
JvmLockOrder实现多线程调用
import javafx.concurrent.Task;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class JvmLockOrder {
synchronized public static void main(String[]args){
ExecutorService executorService = Executors.newCachedThreadPool();
final CountDownLatch latch = new CountDownLatch(1);
OrderServer orderServer = new OrderLockServer(); //类锁
for(int i = 0; i < 10 ; i++){
/*
对象锁
OrderServer orderServer = new OrderLockServer();
*/
executorService.submit(new OrderTask(latch, orderServer) );
}
latch.countDown();
executorService.shutdown();
}
}
分布式锁:
pom.xml添加
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.9.0</version>
</dependency>
public interface OrderServer {
/**
* 生成订单号
* @return
*/
public String getOrderNo();
}
import java.text.SimpleDateFormat;
import java.util.Date;
public class OrderNoLockServer implements OrderServer {
static int number = 0;
public String getOrderNo(){
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("YYYYMMDDHHMMSS");
return simpleDateFormat.format(new Date()) + number++;
}
}
import org.apache.curator.framework.recipes.locks.InterProcessMutex;
import java.util.concurrent.CountDownLatch;
public class OrderTask2 implements Runnable {
private CountDownLatch latch;
private OrderServer orderServer;
InterProcessMutex lock;
public OrderTask2(CountDownLatch latch, OrderServer orderServer, InterProcessMutex lock){
this.latch = latch;
this.orderServer = orderServer;
this.lock = lock;
}
@Override
public void run() {
try {
latch.await();
lock.acquire();
System.out.printf("线程名%s订单好:%s\r\n", orderServer.getClass().getName(), orderServer.getOrderNo());
lock.release();
} catch (Exception e) {
e.printStackTrace();
}
}
}
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.locks.InterProcessMutex;
import org.apache.curator.retry.ExponentialBackoffRetry;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CuratorLock {
final static CuratorFramework client = CuratorFrameworkFactory.builder().connectString("192.168.0.102:2181,192.168.0.102:2182,192.168.0.102:2183").retryPolicy(new ExponentialBackoffRetry(100,1)).build();
public static void main(String[]args){
client.start();
ExecutorService executorService = Executors.newCachedThreadPool();
final CountDownLatch latch = new CountDownLatch(1);
InterProcessMutex lock = new InterProcessMutex(client, "/bit");
for(int i = 0; i < 10 ; i++){
executorService.submit(new OrderTask2(latch, new OrderNoLockServer(), lock ) );
}
latch.countDown();
executorService.shutdown();
}
}