存档

2008年10月 的存档

java多线程设计wait/notify机制 (synchronized与对象锁)

2008年10月26日

 转载自一篇经典的终结,忘记出处了……百看不厌

synchronized(obj) {
    while(!condition) {
        obj.wait();
    }
    obj.doSomething();
}

当线程A获得了obj锁后,发现条件condition不满足,无法继续下一处理,于是线程A就wait() , 放弃对象锁.

之后在另一线程B中,如果B更改了某些条件,使得线程A的condition条件满足了,就可以唤醒线程A:

synchronized(obj) {
    condition = true;
    obj.notify();
}

需要注意的概念是:

# 调用obj的wait(), notify()方法前,必须获得obj锁,也就是必须写在synchronized(obj) {…} 代码段内。

# 调用obj.wait()后,线程A就释放了obj的锁,否则线程B无法获得obj锁,也就无法在synchronized(obj) {…} 代码段内唤醒A。

# 当obj.wait()方法返回后,线程A需要再次获得obj锁,才能继续执行。

# 如果A1,A2,A3都在obj.wait(),则B调用obj.notify()只能唤醒A1,A2,A3中的一个(具体哪一个由JVM决定)。

# obj.notifyAll()则能全部唤醒A1,A2,A3,但是要继续执行obj.wait()的下一条语句,必须获得obj锁,因此,A1,A2,A3只有一个有机会获得锁继续执行,例如A1,其余的需要等待A1释放obj锁之后才能继续执行。

# 当B调用obj.notify/notifyAll的时候,B正持有obj锁,因此,A1,A2,A3虽被唤醒,但是仍无法获得obj锁。直到B退出synchronized块,释放obj锁后,A1,A2,A3中的一个才有机会获得锁继续执行。

java , , ,

用异或操作符来交换二个的值

2008年10月26日

非常常用的一个算法就是,a和b的交换,我们总是用到一个中间变量来进行交换。
其实可以用异或符来计算,这样就不会花销额外空间了,因为异或是可逆的。
比如a^b=c c^b=a 所以a可以通过可逆计算,算回来的。
a和b的交换:
a = a^b
b = b^a 此时的b就相当于被异或回来的a
a = a^b 这里的思路要转一转,我们可以想成,相当于是 a = (a^b)^a = (b^a)^a = b(注意!这里的a和b都是原始的)

java ,

输出二进制、八进制、16进制字符串的算法

2008年10月26日

首先建立矩阵图,让我们可以针对不同的数字,取不同的字符,如果要输入10的16进制,只需要digits[10],这样就可以将数字与字符对应起来:

  1. final static char[] digits = {
  2.  0 , 1 , 2 , 3 , 4 , 5 ,
  3.  6 , 7 , 8 , 9 , a , b ,
  4.  c , d , e , f
  5. };

接下来的思路是,任意举一个数字,然后将它在草稿纸上写成二进制
0100111010111100101
我们按照3位3位的划分开来(准备8进制的取法),之后每3位取其值,就是8进制的表示了。
0 100 111 010 111 100 101
0 4 7 2 7 4 5
我们按照4位4位的划分,之后每4位取其值,就是16进制的表示了。
010 0111 0101 1110 0101
 2 7 5 E 5
我们现在要做的就是要用一个掩码,去取我们要取的数字,比如以16进制为例,先用掩码0000000 1111和我们的数字去做与操作,得出的就是5,之后让我们的数字右移4位(用>>>操作符),再用掩码做与操作,得出E,依次循环。算法如下:

  1. private static String toUnsignedString(int i, int shift) {//shift就是移的位数,二进制1,8进制3,16进制4
  2.     char[] buf = new char[32];
  3.     int charPos = 32;
  4.     int radix = 1 << shift;
  5.     int mask = radix1;
  6.     do {
  7.         buf[--charPos] = digits[i & mask];
  8.         i >>>= shift;
  9.     } while (i != 0);
  10.  
  11.     return new String(buf, charPos, (32charPos));
  12.     }

上面是对于int算法,其他数据类型也一样

float 4 字节 32位IEEE 754单精度
double 8 字节 64位IEEE 754双精度
byte 1字节 -128到127
short 2 字节 -32,768到32,767
int 4 字节 -2,147,483,648到2,147,483,647
long 8 字节 -9,223,372,036,854,775,808到9,223,372,036, 854,775,807
char 2 字节 整个Unicode字符集
boolean 1 位 True或者false

另外需要补充的基础知识是负数的二进制形式
计算机中的负数是以补码形式来存放的,出发点是计算机中没有减法,只有加法,那么如何让一个正数与一个负数去相加呢? 我们举个例子:8+(-6)= (8 + (10-6))%10 = 2
这里我们先对-6进行一个转换,让它和模相加,取出一个4,让4和8去加,然后取模,得出2.(这里的模是10)。
18-9 = (18 + 91)%100 = 9
780-50 = (780+950)%1000 = 730
这其中的规律,相信大家一定可以猜到了。
同样,计算机中的负数,也是这么表示的,比如-1,就是11111111111111111111111111111111,一旦与1去相加,刚好进位到溢出为止,得到全部的0.

java , , ,

Protege教程——OWL中类的丰富表达能力

2008年10月23日

这里是Protege教程中一些比较重要的片段,完整教程在http://www.crabone.com/index.php/protege-introduction#more-6

当我们再次回顾创建类的6种方法时,我们可曾反过来想想,如果让我们来设计OWL语言,我们会设计出几类创建类的方法?

这块板是属于木头的——类:木头(名词型)
你是是很有理想的——类:很有理想的(有:动词;理想:名词;属于动宾型)
这个材料既是属于树胶又是属于塑料的——类:树胶∩塑料(名词和名词的集合型)
他是男人——类:男人(名词型)

它是吃肉的。(吃:动词;肉:名词;属于动宾型)
他是有一颗赤诚热心的人——类1∩类2;类1:人(名词型);类二:有一颗赤诚热心的(量词动宾型)
这类皇冠都镶有No.1098型钻石——类:镶有No.1098型钻石的(具体个体的动宾型)
这批货物要么是可乐瓶,要么是啤酒瓶——枚举类:类1和类二

我们会发现,上面的这些类的定义方法, 阅读全文…

Protégé , , , ,

Protege教程——Property Domains and Ranges

2008年10月23日

其实就是一个属性的类型和范围,比如 int i;3<i<10 那么int就是i的domain,range就是3-10。

用英文来形象的表达就是:Properties link individuals from the domain to individuals from the range.

在我们这个Organization的例子中,我们拿hasInterest这个Property来说,它的domain就是Organization,它的Range就是Interest。

注意!Properties的domain,range和Properties的6大特性不一样,6大特性那是一种推理机制要用到的约束——Constraint,而domain,range是一种公理——axiom。什么意思?约束是用来限制的,可以用推理机制来验证,如果限制出了问题就会推理出错。而公理总是对的,推理要基于它们来推理。举个例子,hasTopping的domain我们定义为Pizza,如果在本体上,发现hasTopping连接到了icecream,那么是不会报错的,OWL会认为,icecream为Pizza的子类,这在W3C的文档上有详细的语义推理定义,见下面的公式。除非……你在构建本体的时候强行定义了,icecream和Pizza是相互Disjoint的,见3.5节。

if
T(?p, rdfs:domain, ?c1)

T(?c1, rdfs:subClassOf, ?c2)
then
T(?p, rdfs:domain, ?c2)

Protégé , , , ,

Protege教程——创建OWL Properties

2008年10月23日

这里是Protege教程中一些比较重要的片段,完整教程在http://www.crabone.com/index.php/protege-introduction#more-6

OWL Properties代表了一种关系 relationship,在OWL里,有2种类型的Properties。一种叫Object Properties,代表了individual到individual之间的一种关系。还有一种叫Datatype Properties,代表了individual和基本数据类型的关系,有点像类的属性,比如年龄、身高等。还有一种叫Annotation properties,是属于元数据,数据的数据,可以用来解释Classes、Individual、Object/Datatype Properties。下图以这3种类型,举个例子:

阅读全文…

Protégé , , , ,

Protege教程——DisjointClasses(一个非常重要的公理)

2008年10月23日

这里是Protege教程中一些比较重要的片段,完整教程在http://www.crabone.com/index.php/protege-introduction#more-6

DisjointClasses、SubClassOf、EquivalentClasses是类的三大公理,见下图:

SubClassOf已经在上一节讲过了, 阅读全文…

Protégé , , , ,

Protege教程——创建一棵类的层次树

2008年10月23日

这里是Protege教程中一些比较重要的片段,完整教程在http://www.crabone.com/index.php/protege-introduction#more-6

创建类,有6种方式,在我的OWL入门教程中,有非常详细的阐述,想了解的朋友去看看。
6种创建类的方法
在创建本体的时候,用的最多的当然是第一种方法————Named Class。这种Class也被称为Plain Class,意思就是没有任何语义的类,仅仅是一个标示。好了,我们开始!

阅读全文…

Protégé , , , ,

本体建模设计模式——If-Then结构

2008年10月11日

这个模式是从继承的角度来描述的,并非我们所熟悉的因果关系。它不能描述例如“如果今天下雨,我们不去春游”这样的语义,但它能描述例如“如果这个社团的兴趣是足球,则它就是球类社团”。前者不能用OWL来描述语义是因为下雨和春游没有内在的关联,后者能用OWL来描述语义是因为足球和球类社团存在着关系。从一些案例中,总结出If-Then结构能将某些类用前因后果联系起来,但是必须的一个条件是它们之间存在着一定的关联。我们来看UML结构图:

从图中我们可以总结出这个模式中含有2个公理,1个表达方式,第一个公理是EqualentClasses,意思是将一个命名类与一个匿名类等价,模拟其If条件,这之中用到了表达方式someValuesFrom,意思为只要这个命名类有了这个条件后,即会如何。第二个公理是SubClassOf,描述了Then之后的条件,也运用到了someValuesFrom。在这个模式中有一个命名类if_then_class,这个类属于中间过渡类,在这个设计模式之后的类或许根本都不知道这样的类存在,但却在被它的If-Then结构引导着。
我们设计出了这样一个应用场景:在一个学校中,只要是球类社团,就有体育经济补助,反过来说,只要一个社团它是球类社团,它不自觉地就成为了体育经济补助类社团。
我们首先把if_then_class构造出来,先命名If_BallOrg_Then_SportSubsidyOrg,之后让它去继承一个匿名类,这个匿名类就是Then之后的结果,最后利用EquivalentClasses公理和另外一个匿名类等价,表示了If 的条件:

  1. <SubClassOf>
  2.         <OWLClass URI="&organizations;If_BallOrg_Then_SportSubsidyOrg"/>
  3.         <OWLClass URI="&organizations;Organization"/>
  4.     </SubClassOf>
  5.     <SubClassOf>
  6.         <OWLClass URI="&organizations;If_BallOrg_Then_SportSubsidyOrg"/>
  7.         <ObjectSomeValuesFrom>
  8.             <ObjectProperty URI="&organizations;HasSubsidy"/>
  9.             <OWLClass URI="&organizations;SportSubsidy"/>
  10.         </ObjectSomeValuesFrom>
  11.     </SubClassOf>
  12.     <EquivalentClasses>
  13.         <OWLClass URI="&organizations;If_BallOrg_Then_SportSubsidyOrg"/>
  14.         <ObjectSomeValuesFrom>
  15.             <ObjectProperty URI="&organizations;hasInterest"/>
  16.             <OWLClass URI="&organizations;BallSport"/>
  17.         </ObjectSomeValuesFrom>
  18.     </EquivalentClasses>

完成了这个if_then_class的定义后,我们来加入应用元素进行测试。第一个类是一个足球社团FootballOrg,让它满足if_then_class中的If条件,值得注意的是FootballOrg对if_then_class一无所知,它根本不知道有这样一个条件性的类存在,就好比每个网站并不知道自己的排名,自己也无法排名,但专业的排名机构会对其排名。第二个类是体育经济补助类社团SportSubsidyOrg,这个类同样也不知道if_then_class,更不会知道FootballOrg。

  1. <SubClassOf>
  2.         <OWLClass URI="&organizations;FootballOrg"/>
  3.         <OWLClass URI="&organizations;Organization"/>
  4.     </SubClassOf>
  5.     <SubClassOf>
  6.         <OWLClass URI="&organizations;FootballOrg"/>
  7.         <ObjectSomeValuesFrom>
  8.             <ObjectProperty URI="&organizations;hasInterest"/>
  9.             <OWLClass URI="&organizations;Football"/>
  10.         </ObjectSomeValuesFrom>
  11.     </SubClassOf>
  12.  
  13.     <SubClassOf>
  14.         <OWLClass URI="&organizations;SportSubsidyOrg"/>
  15.         <OWLClass URI="&organizations;Organization"/>
  16.     </SubClassOf>
  17.     <EquivalentClasses>
  18.         <OWLClass URI="&organizations;SportSubsidyOrg"/>
  19.         <ObjectSomeValuesFrom>
  20.             <ObjectProperty URI="&organizations;HasSubsidy"/>
  21.             <OWLClass URI="&organizations;SportSubsidy"/>
  22.         </ObjectSomeValuesFrom>
  23.     </EquivalentClasses>

FootballOrg继承了一个匿名类,说明这个社团有一些兴趣爱好是在足球上的。SportSubsidyOrg等价一个类,说明了凡是有体育津贴的,一律是属于SportSubsidyOrg类的。当推理完成后,这3个类发生了关系。首先,If_BallOrg_Then_SportSubsidyOrg由于已经继承了一个匿名类,这个匿名类是有体育津贴的,因此If_BallOrg_Then_SportSubsidyOrg被Classify到了SportSubsidyOrg下属。其次,FootballOrg继承了一个匿名类,这个匿名类是有兴趣爱好足球的,因此FootballOrg被Classify到了If_BallOrg_Then_SportSubsidyOrg下属。由于If_BallOrg_Then_SportSubsidyOrg这座桥的原因,现在FootballOrg被归属到了SportSubsidyOrg类里面,即:FootballOrg在毫不知情的情况下,成为了SportSubsidyOrg的子类。我们在总结中,发现了这3个类的关联都是由于EquivalentClasses这个公理起到了连接作用,将本来并不认识的2个类,通过类的属性将它们关联了起来,从来形成了一张语义大网。if_then_class在这个模式中也起到了这种作用。

本体建模设计模式ODPS , , ,