long

关于JVM中long和double的读取原子性

为君一笑 提交于 2019-12-17 14:21:47
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 今天看《Java并发编程实战》的书中,关于long和double的原子性有这么一段话,意思就是在JVM中,对于32位(或者以下)的数值变量都是原子性读写,但是对于long和double这种64位的操作是非原子性。分成两次32位的操作。 在以下这种操作中就会出现读取的数值错误。 线程A先写高位32位操作, 线程B读高位32位, 线程B读地位32位, 线程A写地位32位。 那么解决办法就是对变量加上volatile关键字,volatile关键字有3个主要功能,第一个就是可见性,每次直接从内存读写。第二个就是禁止指令重排序,在JVM中会对指令进行优化,优化的时候可能会对指令进行排序。第三个就是对volatile修饰的变量读取都是原子性的。 但是书上没有说操作系统的位数和JVM的位数。 所以我猜想,只有64位JVM+64位操作系统+64位硬件才能实现对64位long和double的原子性读取。 来源: oschina 链接: https://my.oschina.net/u/2250599/blog/533108

long, unsigned long不是跨平台的(慎用)

风格不统一 提交于 2019-12-07 20:46:53
项目中用到long、long long等字段,遇到一些问题。先说得到的一些结论: 大小端:Windows、Linux是小端,AIX是大端。 sizeof(指针类型)=程序位数/8。 long、unsigned long不是跨平台的,一定要慎用。 自己写了程序测试各平台下(Windows、Linux、AIX),C++各基本类型的最大值、最小值,以及占用字节数。 #include <iostream> #include <limits.h> using namespace std; void checkEndian(); int main() { checkEndian(); cout<<"程序位数="<<sizeof(void*)*8<<endl; cout<<endl<<"各种数据类型:"<<endl; cout<<"sizeof(char)="<<sizeof(char)<<endl; cout<<"sizeof(int)="<<sizeof(int)<<endl; cout<<"sizeof(unsigned int)="<<sizeof(unsigned int)<<endl; cout<<"sizeof(short)="<<sizeof(short)<<endl; cout<<"sizeof(long)="<<sizeof(long)<<endl; cout<<

自定义ViewGroup (3) 与子View之间 Touch Event的拦截与处理

情到浓时终转凉″ 提交于 2019-12-07 04:07:04
在昨天的博客( 自定义ViewGroup(2) )中,我们解决了多个手指交替滑动带来的页面的跳动问题。但同时也还遗留了两个问题。 我们自定义的这个ViewGroup本身还不支持onClick, onLongClick事件。 当我们给子View设置click事件后,我们的ViewGroup居然不能滑动了。 相对来讲,第一个问题稍稍容易处理一点,这里我们先说一下第二个问题。 onInterceptTouchEvent()的作用以及何时会被调用 onInterceptTouchEvent()是用来给ViewGroup自己一个拦截事件的机会,当ViewGroup意识到某个Touch事件应该由自己处理,那么就可以通过此方法来阻止事件被分发到子View中。 为什么onInterceptTouchEvent()方法只接收到来ACTION_DOWN事件??需要处理ACTION_MOVE,ACTION_UP等等事件吗?? 按照google官方文档的说明: 如果onInterceptTouchEvent方法返回true,那么它将不会收到后续事件,事件将会直接传递给目标的onTouchEvent方法(其实会先传给目标的onTouch方法) 如果onInterceptTouchEvent方法返回false,那么所有的后续事件都会先传给onInterceptTouchEvent