本地jvm锁
搭建本地卖票案例
package com.test.lockservice.service.impl;
import com.test.lockservice.mapper.TicketMapper;
import com.test.lockservice.service.TicketService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @Author sl
*/
@Service
public class TicketServiceImpl implements TicketService {
@Autowired
private TicketMapper ticketMapper;
private int count = 5000;
@Override
public void sellTicket() {
count = count -1;
System.out.println("count:"+ count);
}
}
使用jmeter压测
5000个请求测试买票,查看是否出现超卖问题
出现了超卖问题
本地synchronized和ReentrantLock解决本地超卖问题
package com.test.lockservice.service.impl;
import com.test.lockservice.mapper.TicketMapper;
import com.test.lockservice.service.TicketService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @Author sl
*/
@Service
public class TicketServiceImpl implements TicketService {
@Autowired
private TicketMapper ticketMapper;
private int count = 5000;
@Override
public synchronized void sellTicket() {
count = count -1;
System.out.println("count:"+ count);
}
}
或者使用ReentrantLock
package com.test.lockservice.service.impl;
import com.test.lockservice.mapper.TicketMapper;
import com.test.lockservice.service.TicketService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.concurrent.locks.ReentrantLock;
/**
* @Author sl
*/
@Service
public class TicketServiceImpl implements TicketService {
@Autowired
private TicketMapper ticketMapper;
private int count = 5000;
private ReentrantLock lock = new ReentrantLock();
@Override
public void sellTicket() {
lock.lock();
try {
count = count -1;
System.out.println("count:"+ count);
}finally {
lock.unlock();
}
}
}
jmeter压测结果显示,5000总票数,压测5000,都能够解决超卖的现象
将共享资源放入mysql
查库操作,演示超卖现象
package com.test.lockservice.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.test.lockservice.mapper.TicketMapper;
import com.test.lockservice.model.Ticket;
import com.test.lockservice.service.TicketService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.concurrent.locks.ReentrantLock;
/**
* @Author sl
*/
@Service
public class TicketServiceImpl implements TicketService {
@Autowired
private TicketMapper ticketMapper;
// private ReentrantLock lock = new ReentrantLock();
@Override
public void sellTicket() {
// lock.lock();
try {
// 查询票数
Ticket ticket = ticketMapper.selectOne(new Query