java控制并发
‘壹’ java开发 怎么控制 每秒并发数
java.util.concurrent.Executors里有很多方法创建固定个数的线程池
还有java.util.concurrent.ThreadPoolExecutor等
// 构造一个线程池
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2, 10, 3,
TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(3),
new ThreadPoolExecutor.DiscardOldestPolicy());
‘贰’ java中如何限制并发数量
常见的做法是建立线程池,如果线程池满了就禁止新的连接。
线程池可以看作一个令牌库。如果要运行,就需要获取一个令牌,运行完毕退回令牌。如果令牌发光了,就禁止新的运行,等待退回的令牌。
‘叁’ java防止并发的几种方法
使用synchronized关键字3种使用方法:
修饰类方法,作用于当前实例加锁,进入方法要获取当前实例的锁
修饰静态方法,作用于当前实例加锁,进入方法要获取当前实例的锁
修饰代码块,指定加锁对象,给指定对象加锁,进入代码块要先获取指定对象的锁(synchronized参数要传入固定的对象才能起到作用)
使用原子操作:
java 在 SDK atomic包下的提供了原子操作的类,常用的有
AtomicBoolean
AtomicInteger
AtomicIntegerArray
AtomicIntegerFieldUpdater
AtomicLong
AtomicLongArray
AtomicLongfieldUpdater
AtomicMarkableReference
AtomicReference
AtomicReference
AtomicReferenceArray
AtomicReferenceFieldUpdater
AtomicStampedReference
DoubleAccumulator
DoubleAdder
LongAccumulator
LongAdder
Striped64
其中atomicboolean atomicinteger atomicreperence常用的方法及含义
get() 获取当前值
set()设置当前值
getAndSet(V newValue) 获取当前值并设置最新的值
compareAndSer(V expect,V update)如果expect与当前值相同就设置update为最新值
‘肆’ java中怎么实现高并发
对于并发操作,都要上锁的,设置一个字段记录抽到奖的人数,每抽到一个就让update该字段值+1,更新过程中数据库会自动给数据库上锁,直到commit提交,这里就避免了你说的同时查询的问题。
‘伍’ java如何处理高并发
你指的高并发量大概有多少?x0dx0a几点需要注意:x0dx0a尽量使用缓存,包括用户缓存,信息缓存等,多花点内存来做缓存,可以大量减少与数据库的交互,提高性能。x0dx0a用jprofiler等工具找出性能瓶颈,减少额外的开销。x0dx0a优化数据库查询语句,减少直接使用hibernate等工具的直接生成语句(仅耗时较长的查询做优化)。x0dx0a优化数据库结构,多做索引,提高查询效率。x0dx0a统计的功能尽量做缓存,或按每天一统计或定时统计相关报表,避免需要时进行统计的功能。x0dx0ax0dx0a能使用静态页面的地方尽量使用,减少容器的解析(尽量将动态内容生成静态html来显示)。x0dx0a解决以上问题后,使用服务器集群来解决单台的瓶颈问题。x0dx0a基本上以上述问题解决后,达到系统最优。x0dx0ax0dx0a至于楼上有人提到别用JAVA来做,除非是低层的连接数过大(如大量的端口占用需求),这种情况下考虑直接C来写,其他的可以用JAVA来做。x0dx0ax0dx0a可以网上购买视频做教育学习。
‘陆’ java如何创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。求代码
packagetest;
importjava.util.concurrent.ExecutorService;
importjava.util.concurrent.Executors;
{
publicstaticvoidmain(String[]args){
=Executors.newFixedThreadPool(3);
for(inti=0;i<10;i++){
finalintindex=i;
fixedThreadPool.execute(newRunnable(){
publicvoidrun(){
try{
System.out.println(index);
Thread.sleep(2000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
});
}
}
}
因为线程池大小为3,每个任务输出index后sleep 2秒,所以每两秒打印3个数字。
定长线程池的大小最好根据系统资源进行设置。如Runtime.getRuntime().availableProcessors()