JAVA中的自增自减操作不是原子的
i++ 并不是一个原子操作,Java Threads这本书说它"其实是载入、变更与存储的语法糖" 。 所以,如果i++属于临界区,则应该对它进行同步。
i++ 并不是一个原子操作,Java Threads这本书说它"其实是载入、变更与存储的语法糖" 。 所以,如果i++属于临界区,则应该对它进行同步。
对系统进行预发布测试时,应该保证不会触碰到生产环境中系统的应用,否则你测的对象就不是预发服务器了。 1.用浏览器访问预发web应用: 通过改写浏览器端hosts,把正式域名指向预发服务器。 2.一个预发系统以RPC方式调用另一个预发系统: 如果有注册中心、有服务发现机制,则可以让RPC服务提供者以特殊的版本号在预发环境发布,服务使用者在预发环境用这个版本号访问它。 如果没有服务发现机制,就把服务提供者的预发环境IP告诉服务使用者 3.一个预发系统发异步消息给另一个预发系统: 预发系统搭建自己的消息中间件服务器 4.期望测试时造的数据只被预发的task (如quartz) 访问到 这个比较难,因为预发系统和生产环境一般共享同一套数据库,预发环境造的数据也会被生产环境的task访问到。这时一般要在表里为预发用的数据专门开设一个标志位字段,如果有多张表,可能每张表都需要这样的字段;再在应用代码里判断当前数据是否是预发数据;这种做法很繁琐,而且直接侵入了系统。
PC: 各线程私有。 每个线程有自己的“当前指令地址”,否则会乱套 VM Stack: 也是各线程私有,同上理解。 Heap: 各线程共有。 Method Area: 各线程共享。
JAVA虚拟机是一台“计算机”,它的内存结构跟物理机进程的内存结构有点类似: PC Register: 相当于普通进程中Text段中的PC值 VM Stack: 相当于普通进程中的Stack Heap: 相当于普通进程中的Heap Method Area: 相当于普通进程中的Text段(指令), 和Static Data(常量、静态变量) 以上对应关系都是模糊的,只是让你对JVM内存结构有个感性的认识
现在ubuntu 12.04对应的svn版本默认是1.7. 如果一定要装1.6,可以看 http://askubuntu.com/questions/205342/how-do-i-downgrade-to-subversion-1-6的第一个回答,亲证可用
如何让virtualbox的主机能访问宿机,宿机又能访问主机所在局域网? 答案是在virtualbox里配置两块网卡: 1. 配一个Host-Only方式,这样主机就能访问宿机 2. 再配一个NAT方式,这样宿机就能访问主机所在局域网 (还要在虚拟机里把DNS配的跟主机使用的DNS一样,否则无法用域名访问主机所在局域网里的服务器)
IA32体系规定数据不能直接从存储器到存储器, 而必须先从存储器到寄存器,再从寄存器到目标存储器。 比如 int x = y 这样的赋值操作实际上就有两步指令。
APUE:如果线程试图对一个mutex加锁两次,那么它就会陷入死锁。 分析一下: 1. 第一次上锁成功后,获得锁 2. 第二次上锁时需要等待锁被本线程释放;而本线程目前已经在等待锁,无法释放第一次获得的锁;所以这个等待将是无限期的。 可重入锁(reentrant lock)就是用来避免这种情况发生的: 第二次上锁时不需要等待第一次上的锁被释放;java的ReentrantLock和synchronized关键字都使用了这种机制。 不过,Java里ReentractReadWriteLock在JDK 1.6 update 18 之前仍然可能造成单线程死锁: 拿到一个读锁,然后要求拿写锁。拿写锁时需要等待读锁被本线程释放(这里要拿的锁而已经锁上的锁是不同的,所以Reentrant不起作用),而本线程已经在等待写锁。无限循环的等待,造成死锁。这就是所谓的“读锁不可升级”
无干货,仅用作demo #include <stdio.h> #include <signal.h> static void print_sig(int); int main(){ signal(SIGQUIT, print_sig); signal(SIGKILL, print_sig); while(1){ pause();//挂起以等待信号 } } static void print_sig(int signo){ printf("Signal Encountered: %d\n", signo); } 执行它,然后用另一个进程执行kill -3 pid,可以在控制台看到输出"Signal Encountered: 3"; 但如果kill -9 pid,则看不到任何输出,因为UNIX环境规定kill -9不准block.
想入门汇编语言可以看CSAPP(《深入理解计算机系统》)第二版第3章。 它一般先来一段C语言编译成目标代码,然后反汇编一下,再对照讲解C代码和反汇编出来的汇编代码,这样弄比较好理解。 附:UNIX环境中反汇编的命令是 objdump -d 可执行文件