关于多线程的一点疑问

java多线程对同一个对象操作时需要加锁,但是计算机进程在cpu交叉执行,线程包含在进程里,线程也是交叉执行,也就是说,同一时刻cpu只会执行一个线程,那么对对象必然是唯一的操作,所以为什么会需要加锁呢??求解释!

最重要得是不是所有操作都是原子操作,你看起来觉得只是一条语句,但是对应可能是多条指令,所以在执行这条语句的指令时,但还没执行完这条语句的所有指令时,随时可能被切换,所以用锁来保证在被切换后,锁没释放前,其它线程也不能执行这段代码

你知道多核不,而且有时候编译器优化得到的不是你想要的

确实你说得没错,同一个时刻只会开启一个线程,那么理论上,你的cpu效率够高,你可以不同步开一百万个线程,线程内的运算是耗时的。当他们都在运行时,并共用一个变量,若无锁,它们会各抢各的,而不是我用完你用这种有序动作。

编译器编译不到自己想要的

    首先,这个会根据机器不同,涉及到多CPU的问题。而你所说的“同一时刻cpu只会执行一个线程,那么对对象必然是唯一的操作”是错误的。
    目前对多线程理解还不够深,我也就不懂就不瞎BB了
    具体内容我推荐您看这篇blog:http://www.cnblogs.com/wxd0108/p/5479442.html

对于多线程而言加锁的原因我想最大的是为了防止线程死锁吧(本人刚开始接触多线程,理解还不够,觉得废话请忽略)

一个所谓的线程分为好几个命令,比如一个卖票系统,有10张票,两个线程A、B一起进行,每个线程分为两步:1.判断票数是否大于0;2.卖票。当卖到最后一张的时候,A判断大于0,然后就开启了B线程,也判断到票数大于0,那么问题来了,最后一张卖给谁呢?

加锁并不是一个好做法.
无论是购票也好, 其他的也好, 加锁都不是一个好做法.
就好像, 民主是无可奈何的选择一样.
比如买票, 可以考虑Redis队列去做, 利用Redis是单进程, lpop的原子性. 当然这只是我的看法.