大数据学习 - 多线程

什么是进程

不同的应用程序运行的过程中都需要在内存中分配自己独立的运行空间,彼此之间不会相互的影响,我们把每个独立应用程序在内存的独立空间成为当前应用程序运行的一个进程。

什么是线程

位于进程中,负责当前进程中的某个具备独立运行资格的空间,进程是负责整个程序的运行,而线程是程序中具体的某个独立功能的运行。一个进程中至少应该有一个线程。

Java实现多线程的两种方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class ThreadDemo {

public static class ThreadExtend extends Thread{

@Override
public void run() {
System.out.println("继承Thread方式使用多线程...");
}
}

public static class ThreadImplements implements Runnable{

@Override
public void run() {
System.out.println("实现Runnable方式使用多线程...");
}
}

public static void main(String[] args) {
ThreadExtend threadExtend = new ThreadExtend();
threadExtend.start();

Thread threadImplements = new Thread(new ThreadImplements());
threadImplements.start();

}
}

Java 同步关键词解释

synchronized

简单用法:
synchronzied(一个任意的对象[锁]){
doSomething();
}

synchonzied的缺陷:
如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,并执行该代码块时,其他线程便只能一直等待,等待获取锁的线程释放锁,而这里获取锁的线程释放锁只会有两种情况:

  • 获取锁的线程执行完了该代码块,然后线程释放锁
  • 线程执行发生异常,此时JVM会让线程自动释放锁

lock和synchronized的区别

  • lock不是Java语言内置的,synchronzied时Java语言的关键字,因此是内置特性。lock是一个类,通过这个类可以实现同步访问。
  • lock和synchronized有一点非常大的不同,采用synchronized不需要用户去手动释放锁,当synchronized方法或者synchronized代码块执行完之后,系统会自动让线程释放对锁的占用,而lock则必须要用户去手动释放锁,如果没有主动释放锁,就有可能导致出现死锁现象。

lock和synchronized的选择

  • lock是一个借口,而synchronized是Java的中的关键字,synchronized是内置的语言实现
  • synchronized在发生异常时,会自动释放线程占有的锁,因此不会因为异常导致死锁现象发生。而lock在发生异常时,入股哦没有主动通过unlock()去释放锁,则很有可能造成死锁现象,因为使用lock时需要在finally块中释放锁。
  • lock可以让等到锁的线程响应中断,而synchronized却不幸,使用synchronized时,等待的线程会一直等待下去,不能够响应中断。
  • 通过lock可以知道有没有成功获取锁,而synchronized却无法办到。
  • lock可以提高多个线程进行读操作的效率(读写锁)
    在性能上来说,如果竞争资源不激烈,两者的性能时差不多的,而当竞争资源非常激烈时,此时lock的性能要远远优于synchronized,所以,具体使用时要根据实际情况选择。
评论