历程杂技

简介:

为什么会抛出IllegalMonitorStateException?

在使用java线程的时候,我们有时候要调用wait,notifyAll,notify来等待或者唤醒线程,如果这几个方法没有包含在synchronized块中,将抛出IllegalMonitorStateException异常,并且当前线程被中断,为什么?

为什么?因为wait,notifyAll,notify被调用的时候,都要使用到对象的监视器(锁),但是,如果这些方法不被包含在synchronized块中,那么当前线程就获取不到对象的锁,那么当我们wait的时候,wait根本不知道该释放哪个锁,所以就会抛出不合法的锁异常。

为什么?sleep不需要 被包含在synchronized块中呢?因为sleep不要释放锁,所以也就不抛出异常。

"Could not resolve placeholder"解决方案

  除去properites文件路径错误、拼写错误外,出现"Could not resolve placeholder"很有可能是使用了多个PropertyPlaceholderConfigurer或者多个<context:property-placeholder>的原因。
在Spring 3.0中,可以写: 
  1. <context:property-placeholder location="xxx.properties" ignore-unresolvable="true" />  
在Spring 2.5中,<context:property-placeholder>没有ignore-unresolvable属性,此时可以改用PropertyPlaceholderConfigurer。其实<context:property-placeholder location="xxx.properties" ignore-unresolvable="true" />与下面的配置是等价的
  1. <bean id="随便" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
  2.     <property name="location" value="xxx.properties" />  
  3.     <property name="ignoreUnresolvablePlaceholders" value="true" />   
  4. </bean>  

用Spring JMS,在主线程退出后,进程没有退出情况:
今天写了一个关于Spring JMS的小程序,发现主线程退出后,但相应的Server进程却没有退出。用jconsole查看内部线程情况,发现还有好多线程并没有结束。如图:
在网上没有找到相关的资料,无意中看到貌似可以通过ClassPathXmlApplicationContext中的close()方法解决这个问题。对Spring和JMS其实都不算很了解,不知道这个方法是不是合适或者还有更好的方法,先记下,等以后有时间再好好研究研究。
 

Spring获取插入数据库时自增字段的值:
代码如下:
public   int  insertSubscriberRecord( int  websiteId, 
                                  String firstName, 
                                  String lastName, 
                                  String password, 
                                  String email)
{
  Subscriber subscriber 
= new Subscriber(websiteId, firstName, lastName, password, email);
  String insertFileString 
= "INSERT INTO subscribers "
    
+ "(website_id, first_name, last_name, password, email_address) VALUES "
    
+ "(:websiteId, :firstName, :lastName, :password, :emailAddress) ";
  
// see http://static.springframework.org/spring/docs/2.5.x/reference/jdbc.html
  SqlParameterSource fileParameters = new BeanPropertySqlParameterSource(subscriber);
  KeyHolder keyHolder 
= new GeneratedKeyHolder();
  getNamedParameterJdbcTemplate().update(insertFileString, fileParameters, keyHolder);
  
return keyHolder.getKey().intValue();
}

参考: http://www.devdaily.com/blog/post/jdbc/spring-jdbc-insert-auto-generated-key  

Print the Stack Trace of the Exception to a String
 1 import  java.io.PrintWriter;
 2 import  java.io.StringWriter;
 3      public   static  String getStackTrace(Throwable t)
 4      {
 5        StringWriter sw = new StringWriter();
 6        PrintWriter pw = new PrintWriter(sw, true);
 7        t.printStackTrace(pw);
 8        pw.flush();
 9        sw.flush();
10        return sw.toString();
11    }

12
最近在网上看到一个面试题:
1  Integer a  =   null ;
2  Integer b  =  a;
3  int  c  =  b;
What will happen?答案当然是NullPointerException。但是为什么?查看以下代码:
     0  aconst_null
     1  astore_1 [a]
     2  aload_1 [a]
     3  astore_2 [b]
     4  aload_2 [b]
     5  invokevirtual java.lang.Integer.intValue() : int [16]
     8  istore_3 [c]
从字节码中我们可以看出,其实对于装箱和拆箱操作,都是编译器在其中做了支持,将int类型转换成Integer类型(调用Integer.valueOf()方法),或将Integer类型转换成int类型(调用Integer.intValue()方法)。
类在什么时候加载为题
 1  class  Singleton {
 2       private   static   final  Singleton instance  =   new  Singleton();
 3      
 4       private  Singleton() {
 5          System.out.println( "Singleton () " );
 6      } 
 7      
 8       public   static  Singleton getInstance() {
 9           return  instance;
10      }
11  }
然后当我们有以下一句话:
Singleton singleton = null;
or
Singleton singleton;
此时类会加载吗?直观点,打印"Singleton()"这句话会被执行吗?答案是不会被执行,对第二句话还是好理解的,因为singleton实例根本没有被用到,若要用,首先要初始化所以编译器会最后忽略这句话,所以singleton变量不会出现在字节吗中。对第一句,singleton实例会出现在字节码中,并且会赋null的值,但是此时Singleton类还是没有被加载,那么此时singleton这个实例是什么类型呢?这点我有点想不通。或者Java的引用在内存中根本是没有类型的,保证类型安全是在编译器端做的,所以在给singleton实例赋null值得时候,只是表明singleton是一个指向null的引用而已,它并没有指向Singleton实例,所以此时Singleton类不需要加载,只有到真正使用到Singleton类的时候才会去加载Singleton类,并实例化instance成员。
这样就引出另一个问题:
有人说把初始化放在getInstance()方法中,会使instance在用到时才被加载,而不是刚开始程序初始化时就被加载,在C++中,这个确实是这样的,但是在Java中有必要这么做吗?从上述的分析中,我们可以看到,其实Java中根本没有必要,只要像上面一样写就可以了。

相关文章
|
6月前
|
人工智能 算法 Java
【C/C++】从零开始认识C++历程-启航篇
【C/C++】从零开始认识C++历程-启航篇
|
21天前
技术之路的探索与成长
【10月更文挑战第22天】 在技术领域,我们常常面临各种挑战和困惑。本文通过分享个人的技术感悟,探讨了如何面对技术难题、提升自己的技术能力以及保持持续学习的重要性。文章强调了解决问题的方法和思维方式,并提供了实用的建议和经验,帮助读者在技术领域不断成长和进步。
22 3
|
6月前
|
人工智能 物联网 大数据
拥抱变革:我的技术感悟之旅
【5月更文挑战第31天】在技术的海洋中,我学会了乘风破浪。从最初的困惑到逐渐的领悟,每一次技术的更新迭代都让我认识到学习的重要性和适应的力量。本文将分享我个人的技术成长经历,以及在面对新技术时的感悟与应对策略,希望能为同行的技术人员提供一些启示。
卑微的我学习拆装机的革命历程
卑微的我学习拆装机的革命历程
|
Web App开发 人工智能 监控
小可的成长之路——服务器之路
u c个人的云服务器学习与实战的成长之路
186 0
小可的成长之路——服务器之路
|
弹性计算 前端开发 Linux
我的历程分享
简述我的学习生涯
|
Web App开发 移动开发 JSON
前端成长之路之打好根基
前端成长之路之打好根基
311 0
前端成长之路之打好根基
|
数据采集 jstorm 运维
阿里 10 年:一个普通技术人的成长之路
不管是什么角色,成长是我们每个人都必须经历的过程。作为一个技术人,成长不仅是技术上的不断精进,也包括日常工作中的方方面面。本文主要讲述了阿里巴巴高级技术专家在阿里 10 年的成长之路,分享他从一个普通技术人开始,在阿里的三个阶段,以及在晋升、转岗、带团队、做事等方面的心得感悟。
阿里 10 年:一个普通技术人的成长之路
|
数据采集 jstorm 运维
阿里10年:一个普通技术人的成长之路
不管是什么角色,成长是我们每个人都必须经历的过程。作为一个技术人,成长不仅是技术上的不断精进,也包括日常工作中的方方面面。本文分享阿里巴巴高级技术专家在阿里10年的成长之路,分享他从一个普通技术人开始,在阿里的三个阶段,以及在晋升、转岗、带团队、做事等方面的心得感悟。
阿里10年:一个普通技术人的成长之路
|
开发框架 安全 .NET
服务器使用历程
简介: 一般说来,使用服务器所需要安装的网站运行环境以asp以及php为主。