Java内存模型
-
Java采用的是共享内存模型,线程之间的通信是隐式进行
-
实例域、静态域和数组元素都存储在堆内存中,堆内存在线程之间共享;局部变量、方法定义参数和异常处理器参数不会在线程之间共享。
-
as-if-serial语义:不管怎么进行重排序,(单线程)程序的执行结果不能够被改变。没有数据依赖关系的语句才可以进行重排序,也即没有数据依赖的两条语句,编译器和处理器可能会改变执行顺序(多线程时要考虑到控制依赖)。也就是说我们实际写的代码,在真正执行的时候不一定是按照我们写的顺序来执行的。
-
在单线程程序中,对存在控制依赖的操作重排序,不会改变执行结果(as-if-serial);在多线程中,对存在控制依赖的操作重排序,可能会改变程序的执行结果。
-
顺序一致性模型:
- 一个线程中的所有操作必须按照程序的顺序来执行
- (不管程序是否同步)所有线程都只能看到一个单一的操作执行顺序,每个操作都必须原子执行并且立刻对所有线程可见
SQL
if(expression,value1,value2)
expression
为true
的时候返回value1
,否则返回value2
select T.from_id person1,T.to_id person2,count(*) call_count,sum(T.duration) total_duration
from
(
select if(from_id>to_id,to_id,from_id) from_id,
if(from_id>to_id,from_id,to_id) to_id,duration
from Calls
) T
group by T.from_id,T.to_id
between A and B
round()
会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期
左闭右闭,等价于使用>= <=
如果需要这个范围之外的数据,那么使用not between A and B
round()
函数用于把数值字段舍入为指定的小数位数
select p.product_id,round(sum(price*units)/sum(units),2) average_price
from Prices p inner join UnitsSold u
on p.product_id = u.product_id
where u.purchase_date between p.start_date and p.end_date
group by product_id