默认情况下,如果在子查询,函数,视图中尝试去使用ORDER BY,如:

1
select * from (select * from tab where ID>20 order by userID desc) as a order by date desc

可能会遇到下面的错误提示:

除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效。

  • 上述错误产生的原因:针对一个表的SELECT其实并不是返回一个表,而是一个游标。如果一定要使用,则需要配合TOP 100 PERCENT使用:
1
select * from (select top 100 percent * from tab where ID>20 order by userID desc) as a order by date desc

sql 语句中 and 和or的优先级比较

例:
select from test where condition1 or condition2 and condition3;
其执行效果与下面的sql等价:
select
from test where condition1 or (condition2 and condition3);

故可以得出结论:and级别高于or

多个and 和 or 混用也是这个道理,相当于把 and 看成乘号(*), 把or看成加号(+),这样sql的执行顺序就一目了然了。

最后还是建议大家严格按照业务逻辑写sql,必要的时候毫不吝啬使用括号,就像上面的情况,如果逻辑是:condition1 且 condition2 或者 condition3,那么请写成:select * from test where (condition1 and condition2) or condition3这样既不会出错,也方便以后查看代码。

synchronized是Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。

先摆结论

  1. 当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。

  2. 然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。

  3. 尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。

  4. 第三个例子同样适用其它同步方法。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步方法的访问都被暂时阻塞。

  5. 以上规则对其它对象锁同样适用。

阅读全文 »

引言

Android的车辆监控端应用开发中,碰到了轨迹回放控制,播放、暂停、停止不知道该怎么实现的问题,虽然知道要用线程。然后找到了这篇文章,讲解的非常清晰,在此记录之,文末有原文链接。最后将整个轨迹回放实现完成后,再看代码恍然大悟,这不就是音乐播放器的播放、暂停、停止的实现,当初看播放器源码应该很容易就解决了,结果重复造了轮子,不过还是很有收获的。

PS:程序示例部分是我在原作者的基础上修改而来,感觉应该更通俗易懂些,希望能对需要的人有帮助,有什么错误的话还请指正,谢谢。

阅读全文 »

简单类型是按值传递的

Java 方法的参数是简单类型的时候,是按值传递的 (pass by value)。这一点我们可以通过一个简单的例子来说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/** 例 1 * Test.java */
public class Test {
public static void test(boolean test) {
test = !test;
System.out.println("In test(boolean) : test = " + test);
}

public static void main(String[] args) {
boolean test = true;
System.out.println("Before test(boolean) : test = " + test);
test(test);
System.out.println("After test(boolean) : test = " + test);
}
}

运行结果:

Before test(boolean) : test = true
In test(boolean) : test = false
After test(boolean) : test = true

不难看出,虽然在 test(boolean) 方法中改变了传进来的参数的值,但对这个参数源变量本身并没有影响,即对 main(String[]) 方法里的 test 变量没有影响。那说明,参数类型是简单类型的时候,是按值传递的。以参数形式传递简单类型的变量时,实际上是将参数的值作了一个拷贝传进方法函数的,那么在方法函数里再怎么改变其值,其结果都是只改变了拷贝的值,而不是源值。

阅读全文 »