java程序员面试时被问到:如何在j2ee项目中处理高并发量访问? 该怎么回答? 请仔细看题干再回答一般需从三点入手 。
一、程序本身支持高并发 。
简单来说就是要优化我们的代码 。
1、避免使用错误的方式,尽量不用instanceof做条件判断 , 不要将数组声明为:public static final。
2、使用java中效率高的类,比如尽量使用HashMap 和ArrayList ,除非必要,否则不推荐使用HashTable和Vector,后者由于使用同步机制 , 而导致了性能的开销 。
3、尽量指定类的final修饰符 带有final修饰符的类是不可派生的 。在Java核心API中,有许多应用final的例子,例如java.lang.String 。为String类指定final防止了人们覆盖length()方法 。另外,如果指定一个类为final,则该类所有的方法都是final 。Java编译器会寻找机会内联(inline)所有的final方法(这和具体的编译器实现有关) 。此举能够使性能平均提高50%。
4、尽量重用对象,避免频繁的使用new对象 。对于整个应用只需要存在一个实例的类,我们可以使用单例模式 。对于工具类可以使用静态方法的方式访问 。
用new关键词创建类的实例时,构造函数链中的所有构造函数都会被自动调用 。但如果一个对象实现了Cloneable接口,我们可以调用它的clone()方法 。clone()方法不会调用任何类构造函数 。
在使用设计模式(Design Pattern)的场合,如果用Factory模式创建对象,则改用clone()方法创建新的对象实
例非常简单 。例如,
Java代码收藏代码
下面是Factory模式的一个典型实现:
public static Credit getNewCredit() {
return new Credit();
}
改进后的代码使用clone()方法,如下所示:
private static Credit BaseCredit = new Credit();
public static Credit getNewCredit() {
return (Credit) BaseCredit.clone();
}
上面的思路对于数组处理同样很有用 。
5、特别是String 对象的使用中,出现字符串连接情况时应用StringBuffer 代替 。由于系统不仅要花时间生成对象,以后可能还需花时间对这些对象进行垃圾回收和处理 。因此,生成过多的对象将会给程序的性能带来很大的影响 。
6、StringBuffer 的使用:StringBuffer表示了可变的、可写的字符串 。
它有三个构造方法 :
StringBuffer ();//默认分配16个字符的空间
StringBuffer (int size);//分配size个字符的空间
StringBuffer (String str);//分配16个字符 str.length()个字符空间
你可以通过StringBuffer的构造函数来设定它的初始化容量,这样可以明显地提升性能 。这里提到的构造函数是StringBuffer(int length),length参数表示当前的StringBuffer能保持的字符数量 。你也可以使用ensureCapacity(int minimumcapacity)方法在StringBuffer对象创建之后设置它的容量 。首先我们看看StringBuffer的缺省行为,然 后再找出一条更好的提升性能的途径 。
StringBuffer在内部维护一个字符数组 , 当你使用缺省的构造函数来创建StringBuffer对象的时候 , 因为没有设置初始化字符长度 , StringBuffer的容量被初始化为16个字符,也就是说缺省容量就是16个字符 。当StringBuffer达到最大容量 的时候,它会将自身容量增加到当前的2倍再加2,也就是(2*旧值 2) 。如果你使用缺省值,初始化之后接着往里面追 加字符,在你追加到第16个字符的时候它会将容量增加到34(2*16 2),当追加到34个字符的时候就会将容量增加到 70(2*34 2) 。无论何事只要StringBuffer到达它的最大容量它就不得不创建一个新的字符数组然后重新将旧字符和 新字符都拷贝一遍――这也太昂贵了点 。所以总是给StringBuffer设置一个合理的初始化容量值是错不了的,这样会带来 立竿见影的性能增益 。
StringBuffer初始化过程的调整的作用由此可见一斑 。所以,使用一个合适的容量值来初始化StringBuffer永远都是一个最佳的建议 。
7、尽量使用局部变量,调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快 。其他变量,如静态变量、实例变量等 , 都在堆(Heap)中创建,速度较慢 。另外,依赖于具体的编译器/JVM,局部变量还可能得到进一步优化 。请参见《尽可能使用堆栈变量》 。
8、不要重复初始化变量默认情况下,调用类的构造函数时, Java会把变量初始化成确定的值:所有的对象被设置成null,整数变量(byte、short、int、long)设置成0,float和double变量设置成0.0,逻辑值设置成false 。当一个类从另一个类派生时 , 这一点尤其应该注意,因为用new关键词创建一个对象时,构造函数链中的所有构造函数都会被自动调用 。
9、在JAVAORACLE 的应用系统开发中,java中内嵌的SQL语句尽量使用大写的形式,以减轻ORACLE解析器的解析负担 。
10、Java 编程过程中,进行数据库连接、I/O流操作时务必小心 , 在使用完毕后,即使关闭以释放资源 。因为对这些大对象的操作会造成系统大的开销,稍有不慎 , 会导致严重的后果 。
11、由于JVM的有其自身的GC机制,不需要程序开发者的过多考虑,从一定程度上减轻了开发者负担,但同时也遗漏了隐患,过分的创建对象会消耗系统的大量内存 , 严重时会导致内存泄露,因此,保证过期对象的及时回收具有重要意义 。JVM回收垃圾的条件是:对象不在被引用;然而 , JVM的GC并非十分的机智,即使对象满足了垃圾回收的条件也不一定会被立即回收 。所以 , 建议我们在对象使用完毕,应手动置成null 。
12、在使用同步机制时 , 应尽量使用方法同步代替代码块同步 。
13、尽量减少对变量的重复计算
例如:
for(int i = 0;ilist.size; i) {
…
}
应替换为:
for(int i = 0,int len = list.size();ilen; i) {
…
}
14、尽量采用lazy loading 的策略 , 即在需要的时候才开始创建 。
例如:
String str = “aaa”;
if(i == 1) {
list.add(str);
}
应替换为:
if(i == 1) {
String str = “aaa”;
list.add(str);
}
15、慎用异常
异常对性能不利 。抛出异常首先要创建一个新的对象 。Throwable接口的构造函数调用名为fillInStackTrace()的本地(Native)方法 , fillInStackTrace()方法检查堆栈,收集调用跟踪信息 。只要有异常被抛出,VM就必须调整调用堆栈 , 因为在处理过程中创建了一个新的对象 。异常只能用于错误处理,不应该用来控制程序流程 。
16、不要在循环中使用try...catch,应把其放置在最外层 。
17、合理的使用Java类 java.util.Vector 。
简单地说,一个Vector就是一个java.lang.Object实例的数组 。Vector与数组相似,它的元素可以通过整数形式的索引访问 。但是,Vector类型的对象在创建之后,对象的大小能够根据元素的增加或者删除而扩展、缩小 。请考虑下面这个向Vector加入元素的例子:
Java代码收藏代码
Object obj = new Object();
Vector v = new Vector(100000);
for(int I=0;
I100000; I) { v.add(0,obj); }
java电商项目面试官问我高并发多线程怎么解决?这个很简单java解决高并发代码,高并发有多种解决方法:
1、从代码上分入手 , 必须得保证代码没有冗余,不要有废代码;
2、从服务器上入手,高并发一台服务器并发量有限,java解决高并发代码我们可以采用多台服务器来分担压力;
3、从存储方便入手 , 像我们一般高并发但是数据却可以不用存到数据库中的,我们就存在内存中,因为读内存的速度是数据库的N倍 。
java处理高并发时,使用synchronized代码锁防止同时对数据库某一数据的问题 。首先synchronized不可能做到对某条数据库的数据加锁 。它能做到的只是对象锁 。
比如数据表table_a中coloum_b的数据是临界数据java解决高并发代码 , 也就是java解决高并发代码你说的要保持一致的数据 。java解决高并发代码你可以定义一个类,该类中定义两个方法read()和write()(注意,所有有关该临界资源的操作都定义在这个类中),再定义一个静态变量作为锁就可以java解决高并发代码了 。
public static final String LOCK = "table_a_b_lock";
public int read(){
synchronized LOCK{
System.out.println("read data...");
}
}
public void write(String data){
synchronized LOCK{
System.out.println("write data:"data);
}
}
另外,还可以在数据库级别加上锁 。数据库本来就支持不同的隔离级别 。
java高并发?1、在java中java解决高并发代码,高并发属于一种编程术语java解决高并发代码,意思就是有很多用户在访问java解决高并发代码 , 导致系统数据不正确、糗事数据java解决高并发代码的现象 。并发就是可以使用多个线程或进程,同时处理不同的操作 。2、处理高并发的方法
对于一些大型网站,比如门户网站,在面对大量用户访问、高并发请求方面,基本的解决方案集中在这样几个环节java解决高并发代码:使用高性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的Web容器 。
(1)动静分离 。静态资源请求与动态请求分离,项目中需要访问的图片、声音、js/css等静态资源需要有独立的存放位置,便于将来实现静态请求分离时直接剥离出来,比如nginx可以直接配置图片文件直接访问目录 , 而不需要经过tomcat 。这样tomcat就可以专注处理动态请求,操作数据库数据处理之类的 。静态请求代理服务器性能比tomcat高很多 。
(2)引入缓存 。数据库缓存、页面缓存,这东西好用不复杂,搞明白什么地方适用最重要 。简单的例子是频繁读?。?不修改的地方最适用 。也是后续集群做数据共享的一个方式之一,集群环境下,经常会碰到数据共享问题 。
(3)如果将来数据量大,单一数据库成为瓶颈时,数据库的读写分离来了 。数据库集群,读写分离 , 分表分区 。
【java解决高并发代码 java高并发问题】java解决高并发代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java高并发问题、java解决高并发代码的信息别忘了在本站进行查找喔 。
推荐阅读
- 经典第一人称射击类游戏,第一人称射击游戏大作
- 百度云接口phpcms,百度云接口网址
- 经典角色动作单机游戏,经典角色动作单机游戏大全
- 音乐直播带货教程视频,音乐类直播
- 不定参数函数python 不定参数函数怎么理解
- 安卓微信朋友圈照片乱码,安卓微信一键转发朋友圈
- arduino安卓手机外接传感器,arduino把传感器的数据导出
- 网络游戏即时比分网,比分一即时比分网
- linux命令引擎 linux程序启动命令