Java——关于线程

创建一个线程  Thread t = new Thread();

t.run();  只是调用了一个普通方法,并没有启动另一个线程,程序还是会按照顺序执行相应的代码。可以重复调用。

t.start();  则表示,重新开启一个线程,去调用run(),不必等待其他线程运行完,只要得到CPU权限就可以运行该线程。不能重复调用。

start()方法的调用后并不是立即执行多线程代码,而是使得该线程变为可运行态(Runnable),什么时候运行是由操作系统决定的。

从程序运行的结果可以发现,多线程程序是乱序执行。因此,只有乱序执行的代码才有必要设计为多线程。

如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享。

Thread和Runnable的区别

https://www.cnblogs.com/yangdy/p/5274455.html

https://www.cnblogs.com/gowhy/p/4775107.html

实现Runnable接口比继承Thread类所具有的优势:

1):适合多个相同的程序代码的线程去处理同一个资源

2):可以避免java中的单继承的限制

3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立

Java中Synchronized的用法

https://blog.csdn.net/luoweifu/article/details/46613015

https://blog.csdn.net/sinat_32588261/article/details/72880159

synchronized(this)、synchronized(class)与synchronized(Object)的区别

https://blog.csdn.net/luckey_zh/article/details/53815694

java的synchronized(参数),参数是this对象和参数是非this对象的区别

https://blog.csdn.net/xuqiaobo/article/details/51513871

虽然可以使用synchronized来定义方法,但synchronized并不属于方法定义的一部分,因此,synchronized关键字不能被继承。

同一时间只能有一个线程可以访问synchronized的内容,本质是一把锁,(参数)规定了锁的类型,可以是对象或者类的锁,说白了这个参数决定的是这把锁的作用范围。

synchronized(object)单线程

synchronized(classname.class)多线程

这也证明了对象不是类

这个参数就是对象,如果对象不一样就锁不住。

synchronized(this)代码块是锁定当前对象。

多个线程持有对象监视器作为同一个对象的前提下,同一时间只有一个线程可以执行synchronized(任意自定义对象)同步代码快。

异步调用

https://blog.csdn.net/zhuqiuhui/article/details/77982950

同步和异步

https://blog.csdn.net/huangqiang1363/article/details/79508852

"调用"在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在"调用"发出后,"被调用者"通过状态、通知来通知调用者,或通过回调函数处理这个调用。

监视器–JAVA同步基本概念

http://ifeve.com/monitors-java-synchronization-mechanism/

经典解释监视器和对象锁

https://blog.csdn.net/fenglibing/article/details/1483930

为了使数据不被多个线程访问,java 提供了同步块 以及 同步方法两种实现,一旦一段代码被嵌入到一个synchronized关键字中,意味着放入了监视区域,JVM在后台会自动为这段代码实现锁的功能。

我们知道JAVA每个对象(Object/class) 都关联一个监视器,更好的说法应该是每个对象(Object/class)都有一个监视器,对象可以有它自己的临界区,并且能够监视线程序列为了使线程协作,JAVA为提供了wait()和notifyAll以及notify()实现挂起线程,并且唤醒另外一个等待的线程。

猜你喜欢

转载自blog.csdn.net/qq_41596538/article/details/81116903