没有丝毫影响Java 应用一般都是部署在服务器上的,服务器上可不止拥有一个 CPU 了。我们的那些服务器上有 4 颗四核 CPU。Java 是不依赖于操作系统、平台的,Java 应用在单核 32 位 CPU 的 Windows 32 位版本机器上运行,与 N 核 64 位 CPU 的 Linux 64 位版本上运行的结果完全一致。
有,非常有!!!举个简单的例子,对于某些人认为具有线程安全性的final关键字,都不能绝对保证线程安全性。 private final static int codeLine = 100; 对于上面这样一个语句,我们一般会认为是一个int变量指向了100,且不能改变。但是我们从cpu执行角度去看,这句语句的意思是首先声明一个变量,变量是int的,变量名为codeLine,然后才对codeLine赋值考虑一个问题,计算机执行程序是按照指令一条一条执行,那么很有可能刚好执行到int codeLine的时候,线程中断去处理其他地方的代码了,那么我们的codeLine指向的地方就不是100了。因此,对于这个问题,单核处理器都不能保证。更何况双核呢。觉得12楼说得很好!!!
因为:CPU里有缓存
所以,多核CPU缓存可能同时存了相同变量
当这些CPU同时访问一个变量而这个变量又都在CPU缓存里
这个时候如果没有给操作加锁,这是会有影响的。也就是说,如果有人仗着自己艺高人胆大,在编写程序时敢用原子语句,结果程序就可能会在单核系统里不出问题,却在多核系统里出问题。忠告:一定要加锁哦!
单核的时候,由于CPU强大的调度能力,所以让我们感觉到好像可以多个任务进程同时跑起来。其实并不是真正意义上的同时。
多核应该是实现了真正的同时吧。线程并发是在同一个进程内讨论的。也就是说线程的活动范围是严格受限制于进程的。而在同一时刻,一个进程只会在一个CPU中调度,所以不管一个进程有多少个线程,它都是在同一个CPU中运行的。对于线程来说,他根本不知道一共有多少个CPU.个人的理解。
这个完全放屁挖!拿Windows XP举例子, Windows Xp对于mutil-processor 使用的是one-to-one模型
也就是一个kernel thread 对应一个user-level thread
一个user thread由一个kernel thread处理 然后由kernel thread 调用system call 来和处理器交互当线程转换的时候 比如 你有5个线程来处理producer and consumer问题 而你的processor只有2个
这个时候会产生context-switch, 当这个情况发生的时候kernel thread会把你讲的那些东西踢出CPU缓存
转而放到内存中。
而且目前所有的CPU模型中没有一种是many to one的,即 没有一种模型是用2个以上的kernel thread去处理一个user-level thread。
所以原子操作在mutil-processor中是非常安全的。再说数据共享的问题。比如static
static之类的肯定是放在memory里面,而在CPU cache存放的是memory中static的地址。“当这些CPU同时访问一个变量而这个变量又都在CPU缓存里”
这个话更是屁了
这种情况完全不可能发生
CPU cache是由kernel thread控制。而每个CPU是有自己专用的cache的 完全不可能调用别人的
CPU当然有自己的cache 不然共享同一个cache的话怎么会出现数据不同步的情况?
正是因为CPU有各自cache,所以当这些CPU同时访问一个变量,而这个变量都映射在CPU各自的缓存里,就会出现数据不同步的现象,(一个CPU正在回写 但另一个CPU同时在访问)完整地说。这么说够明白了。
这可不是线程切换问题。我以为你也知道这个是同步问题,可惜你认为问题会发生在线程切换的时候,可问题不是发生在线程切换之时。
首先,你得清楚一点,就是不切换线程时,两个线程照样会引用同一个变量。
而问题就在于多CPU的cache都有同一个变量的情况。难道CPU不切换就不会引用同一个变量吗?CPU不切换 cache就不能同时都将一个变量存在各自其中吗?
既然存在这种情况,那么两个CPU同时读写一个变量,这种情况下会发生什么?最后想说的是,在《密码学实践》前言里有段话,说许多密码学家们一起研究一个问题,首先被攻击者要明确的是攻击者攻击的是他的密码系统而不是他的人。同时攻击者在攻击之前,攻击者要明确,攻击的是问题,而不是设计者。
这个是认真讨论问题的人应有的态度,有人“误人子弟”吗?是谁?
对于你这种完全几乎与无知的同学,我承认我是过分认真了。我也不多说什么了 用事实说话吧你去看一下这本书 这本是我最近在看的
这本书你可以翻到第770页,看一下"atomic operation handle"
我做个好人 把书给你 http://download.csdn.net/source/181816如果你拿不出证据(你自己说的话或者想法不是证据)来证明你的屁话,
就不要回帖了
好好回家补补吧
InterlockedDecrement
InterlockedExchange这3个东西在我给你的连接里有 当然你也可以在Kernel32.dll这个dll里面找到。最后对各位同学告诫一下 看书要看仔细 否则读书读到最后跟12楼的那个S~B一样 书读得再多也是没用的
private final static int codeLine = 100;
对于上面这样一个语句,我们一般会认为是一个int变量指向了100,且不能改变。但是我们从cpu执行角度去看,这句语句的意思是首先声明一个变量,变量是int的,变量名为codeLine,然后才对codeLine赋值考虑一个问题,计算机执行程序是按照指令一条一条执行,那么很有可能刚好执行到int codeLine的时候,线程中断去处理其他地方的代码了,那么我们的codeLine指向的地方就不是100了。因此,对于这个问题,单核处理器都不能保证。更何况双核呢。觉得12楼说得很好!!!
可以先去睡一觉然后再来搞这个程序
这只是说明一下双核不会影响到你学习线程
Thread.sleep(1000000000000000);
类的载入,是由虚拟机保证同步的
final变量完全不存在你说的这种情况况且,对于简单类型的编译期final常量,编译时直接内联的。编译后连变量都没有了