java多线程、ThreadLocal与Synchronized区别

一、多线程

1、什么是线程?

进程是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程.进程在执行过程中拥有独立的内存单元,而多个线程共享内存资源,减少切换次数,从而效率更高.线程是进程的一个实体,是cpu调度和分派的基本单位,是比程序更小的能独立运行的基本单位.同一进程中的多个线程之间可以并发执行。

2、线程和进程有什么区别?

线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。别把它和栈内存搞混,每个线程都拥有单独的栈内存用来存储本地数据。

3、Thread 类中的start() 和 run() 方法有什么区别?

start()方法被用来启动新创建的线程,而且start()内部 调用了run()方法,这和直接调用run()方法的效果不一样。当你调用run()方法的时候,只会是在原来的线程中调用,没有新的线程启 动,start()方法才会启动新线程。

4、Runnable接口和Callable接口的区别

Runnable接口中的run()方法的返回值是void,它做的事情只是纯粹地去执行run()方法中的代码而已;Callable接口中的call()方法是有返回值的,是一个泛型,和Future、FutureTask配合可以用来获取异步执行的结果。

5、如何在两个线程之间共享数据

通过在线程之间共享对象就可以了,然后通过wait/notify/notifyAll、await/signal/signalAll进行唤起和等待,比方说阻塞队列BlockingQueue就是为线程之间共享数据而设计。

6、怎么唤醒一个阻塞的线程

如果线程是因为调用了wait()、sleep()或者join()方法而导致的阻塞,可以中断线程,并且通过抛出InterruptedException来唤醒它;如果线程遇到了IO阻塞,无能为力,因为IO是操作系统实现的,Java代码并没有办法直接接触到操作系统。

7、volatile能使得一个非原子操作变成原子操作吗?
一种实践是用 volatile 修饰 long 和 double 变量,使其能按原子类型来读写。

7、用户线程和守护线程

java中线程分为两种类型:用户线程和守护线程。通过Thread.setDaemon(false)设置为用户线程;通过Thread.setDaemon(true)设置为守护线程。如果不设置次属性,默认为用户线程。

守护线程的方式是在线程对象创建 之前 用线程对象的setDaemon方法。setDaemon(true)必须在调用线程的start()方法之前设置,否则会抛出IllegalThreadStateException异常。

用户线程:平时用到的普通线程均是用户线程

守护线程:指在程序运行的时候在后台提供一种通用服务的线程,守护线程是为用户线程服务的,当有用户线程在运行,那么守护线程同样需要工作,当所有的用户线程都结束时,守护线程也就会停止。

用户线程和守护线程的区别:

1. 主线程结束后用户线程还会继续运行,JVM存活;主线程结束后守护线程和JVM的状态由下面第2条确定。

2.如果没有用户线程,都是守护线程,那么JVM结束(随之而来的是所有的一切烟消云散,包括所有的守护线程)。

守护线程最典型的应用就是 GC (垃圾回收器),它就是一个很称职的守护者。

 

二、ThreadLocal 与 Synchronized区别

2.1、ThreadLocal  (提供给每一个线程一个初始值)

1).ThreadLoca原理:

Thread Local Variable(线程局部变量)的意思,其功能其实非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,使每一个线程都可以独立地改变自己的副本,其各自的副本值改变之后就会有所不同,当然不会和其他线程的副本冲突;从线程的角度来看,就好像每个线程都完全拥有该变量一样。

2).ThreadLoca应用场景:

当很多线程需要多次使用同一个对象,并且需要该对象具有相同初始化值的时候最适合使用ThreadLocal。

3).ThradLocal和线程同步机制的区别:

实现机制不同:和线程同步机制一样,都是为了解决多线程中,对同一变量的访问冲突,在普通的同步机制中,是通过对象加锁来实现多个线程对同一个变量的安全访问的.而ThreadLocal是将需要并发访问的资源复制多分,每个线程拥有一份资源,每个线程拥有自己的资源副本,从而也变没有必要对该变量进行同步了.

 面向问题的领域不同: ThreadLocal 并不能替代同步机制,同步机制是为了同步多个线程对相同资源的并发访问,是多个线程之间进行通信的有效方式;而ThradLocal是为了隔离多个线程的数据共享,从根本上避免了多个线程之间对共享资源(变量)的竞争,也就不需要对多个线程进行同步了.

4).何时使用?

如果多个线程之间需要共享资源,以达到线程之间的通信功能,就使用同步机制.

如果仅仅需要隔离多个线程之间的共享冲突,则可以使用ThreadLocal

5).ThreadLocal 与 Synchronized区别

相同:ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。
不同:Synchronized同步机制采用了“以时间换空间”的方式,仅提供一份变量,让不同的线程排队访问。ThreadLocal是以空间换时间将需要并发访问的资源复制多分,每个线程拥有一份资源,每个线程拥有自己的资源副本。

Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ThreadLocalsynchronizedJava中用于多线程编程的两种不同的机制,它们有以下区别: 1. 功能不同: - ThreadLocalThreadLocal是一个线程级别的变量,它提供了一种在多线程环境下保持变量的独立副本的机制。每个线程都可以独立地修改自己的副本,而不会影响其他线程的副本。ThreadLocal通常用于保存线程私有的数据,例如用户身份信息、数据库连接等。 - synchronizedsynchronized是一种用于实现线程安全的机制,它通过对代码块或方法进行加锁来保证同一时间只有一个线程可以执行该代码块或方法。synchronized可以保证多个线程对共享资源的互斥访问,避免了数据竞争和并发问题。 2. 使用方式不同: - ThreadLocal:使用ThreadLocal需要创建一个ThreadLocal对象,并通过其get()和set()方法来获取和设置当前线程的变量副本。每个线程都有自己独立的副本,互不干扰。 - synchronized:使用synchronized需要在代码块或方法前加上synchronized关键字,表示对该代码块或方法进行加锁。只有获得锁的线程才能执行该代码块或方法,其他线程需要等待锁释放后才能执行。 3. 适用场景不同: - ThreadLocal:适用于需要在多线程环境下保持变量的独立副本的场景,例如在Web应用中,每个请求都可以使用一个独立的ThreadLocal对象来保存请求相关的数据。 - synchronized:适用于需要保证多个线程对共享资源的互斥访问的场景,例如多个线程同时修改同一个全局变量时,可以使用synchronized来保证线程安全。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值