多线程
君子为猿
这个作者很懒,什么都没留下…
展开
-
run()方法和start()方法的区别
系统通过调用线程类的start()方法来启动一个线程,此时该线程处于就绪状态,而非线程状态,也就意味着这个线程可以被JVM来调度执行。在调度过程中,JVM通过调用线程类的run()方法来完成实际的操作,当run()方法结束后,此线程就会终止。如果直接调用线程类的run()方法,这会被当做一个普通的函数调用,程序中仍然只有主线程这一个线程。start方法能异步地调用run()方法,但是直接调用run()方法却是同步地,因此无法达到多线程的目的。演示代码:class ThreadDemo extends原创 2020-06-15 16:01:03 · 381 阅读 · 0 评论 -
对volatile的理解与思考
volatile的翻译过来的意思是:易变的、 无定性的;被volatile修饰的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。因为使用Java编程的过程中,有时为了提高程序的运行效率,编译器会自动对其进行优化,把经常被访问的变量缓存起来,程序在读取这个变量是有可能会直接从缓存(例如寄存器)中读取这个值,而不是去内存中读取。这样做的一个好处是提高了程序的运行效率,...原创 2020-04-27 23:58:59 · 199 阅读 · 0 评论 -
ABA问题的产生和解决方案
package CASDemo;import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.AtomicReference;import java.util.concurrent.atomic.AtomicStampedReference;public class ABADemo { sta...原创 2020-04-24 11:49:47 · 477 阅读 · 0 评论 -
关于AtomicInteger、CAS、Unsafe
AtomicInteger,为什么不用synchronized而用CAS?因为synchronized加锁,同一时间段允许一个线程来访问,一致性得到了保证,但是并发性下降;而用CAS没有加锁,使用do while进行比较,保证一致性有保证并发性。Unsafe.getAndAddInt的代码如下: public final int getAndAddInt(Object var1, long...原创 2020-04-23 16:37:10 · 238 阅读 · 1 评论