阿里P7架构师浅析:如何优化Java程序设计、编码提高性能( 三 )

关于线程的操作,要注意如下几个方面:
1. 防止过多的同步
如上所示,不必要的同步常常会造成程序性能的下降 。因此,如果程序是单线程,则一定不要使用同步 。
2. 同步方法而不要同步整个代码段
对某个方法或函数进行同步比对整个代码段进行同步的性能要好 。
3. 对每个对象使用多”锁”的机制来增大并发 。
一般每个对象都只有一个”锁”,这就表明如果两个线程执行一个对象的两个不同的同步方法时,会发生”死锁” 。即使这两个方法并不共享任何资源 。为了避免这个问题,可以对一个对象实行”多锁”的机制 。如下所示:
class foo { private static int var1; private static Object lock1=new Object(); private static int var2; private static Object lock2=new Object(); public static void increment1(){ synchronized(lock1){ var1++; } } public static void increment2(){ synchronized(lock2){ var2++; } }} 
四、输入和输出(I/O)输入和输出包括很多方面,但涉及最多的是对硬盘,网络或数据库的读写操作 。对于读写操作,又分为有缓存和没有缓存的;对于数据库的操作,又可以有多种类型的JDBC驱动器可以选择 。但无论怎样,都会给程序的性能带来影响 。因此,需要注意如下几点:
1. 使用输入输出缓冲
尽可能的多使用缓存 。但如果要经常对缓存进行刷新(flush),则建议不要使用缓存 。
2. 输出流(Output Stream)和Unicode字符串
当时用Output Stream和Unicode字符串时,Write类的开销比较大 。因为它要实现Unicode到字节(byte)的转换.因此,如果可能的话,在使用Write类之前就实现转换或用OutputStream类代替Writer类来使用 。
3. 当需序列化时使用transient
当序列化一个类或对象时,对于那些原子类型(atomic)或可以重建的原素要表识为transient类型 。这样就不用每一次都进行序列化 。如果这些序列化的对象要在网络上传输,这一小小的改变对性能会有很大的提高 。
4. 使用高速缓存(Cache)
对于那些经常要使用而又不大变化的对象或数据,可以把它存储在高速缓存中 。这样就可以提高访问的速度 。这一点对于从数据库中返回的结果集尤其重要 。
5. 使用速度快的JDBC驱动器(Driver)
JAVA对访问数据库提供了四种方法 。这其中有两种是JDBC驱动器 。一种是用JAVA外包的本地驱动器;另一种是完全的JAVA驱动器 。具体要使用哪一种得根据JAVA布署的环境和应用程序本身来定 。
 
五、一些其他的经验和技巧

  1. 使用局部变量 。
  2. 避免在同一个类中动过调用函数或方法(get或set)来设置或调用变量 。
  3. 避免在循环中生成同一个变量或调用同一个函数(参数变量也一样) 。
  4. 尽可能的使用static,final,private等关键字 。
  5. 当复制大量数据时,使用System.arraycopy()命令 。
Java架构师丨苏先生:专注于Java开发技术的研究与知识分享!



推荐阅读