首页 > 试题广场 >

下列说法正确的是()?

[不定项选择题]
下列说法正确的是()?


  • 我们直接调用Thread对象的run方法会报异常,所以我们应该使用start方法来开启一个线程
  • 一个进程是一个独立的运行环境,可以被看做一个程序或者一个应用。而线程是在进程中执行的一个任务。Java运行环境是一个包含了不同的类和程序的单一进程。线程可以被称为轻量级进程。线程需要较少的资源来创建和驻留在进程中,并且可以共享进程中的资源
  • synchronized可以解决可见性问题,volatile可以解决原子性问题
  • ThreadLocal用于创建线程的本地变量,该变量是线程之间不共享的
volatile与synchronized的区别:
volatile本质是在告诉jvm当前变量在寄存器中的值是不确定的,需要从主存中读取,synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住.
volatile仅能使用在变量级别,synchronized则可以使用在变量,方法.
volatile仅能实现变量的修改可见性,但不具备原子特性,而synchronized则可以保证变量的修改可见性和原子性.
volatile不会造成线程的阻塞,而synchronized可能会造成线程的阻塞.
volatile标记的变量不会被编译器优化,而synchronized标记的变量可以被编译器优化.
发表于 2017-08-25 10:28:18 回复(14)
记住一句话,synchronized很强大,既可以保证可见性,又可以保证原子性,而volatile不能保证原子性!
编辑于 2017-08-20 08:22:10 回复(12)
A:可以直接调用run方法, 但就起不到多线程的目的了。
发表于 2017-08-30 21:25:12 回复(0)
A选项错在调用Thread的run方法不会抛出异常。
我们一般使用thread都是new一个线程,然后调用start方法启动,使用start方法才真正实现了多线程运行,thread线程有5种状态,创建-就绪-运行-阻塞-死亡,我们的start方法呢就是就绪这一步,因为这个时候我们的线程并没有立即的执行,而是得等待,等到我们的cpu有空闲的时候,才会执行线程里面的run方法,等run方法执行完了,线程就结束了。
直接使用thread执行run方***咋样呢?因为run方法是thread里面的一个普通的方法,所以我们直接调用run方法,这个时候它是会运行在我们的主线程中的,因为这个时候我们的程序中只有主线程一个线程,所以这样并没有做到多线程的这种目的。
发表于 2019-01-29 11:43:41 回复(0)
 A. 
public class java_thread extends Thread{  
    public static void main(String args[])  
    {  
        (new java_thread()).run();  
        System.out.println("main thread run ");  
    }  
    public synchronized  void run()  
    {  
        System.out.println("sub thread run ");  
    }  
} 
B    是对的
C    volatile不需要加锁,比synchronized更轻量级,不会阻塞线程 从内存可见性角度讲,volatile读相当于加锁,volatile写相当于解锁 synchronized既能保证可见性,又能保证原子性,而volatile只能保证可见性,无法保证原子性 http://www.knowsky.com/1042304.html
D    ThreadLocal存放的值是线程内共享的,线程间互斥的,主要用于线程内共享一些数据,避免通过参数来传递

发表于 2017-08-19 09:52:26 回复(2)
ThreadLocal是用来创建线程的本地变量,既然是本地变量,肯定就不共享了
Synchronized很强大 既能同步 又可见 
发表于 2018-09-09 14:38:01 回复(0)
调用Thread的run() 方法不会报异常,只是直接调用run()方法,相当于就是一个普通的方法,没有实现多线程,调用start()方法才是实现了多线程。
发表于 2022-04-09 09:02:09 回复(0)
原子性是指一个操作是不可中断的,要么全部执行成功要么全部执行失败,有着“同生共死”的感觉。及时在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程所干扰。

synchronized语义表示锁在同一时刻只能由一个线程进行获取,当锁被占用后,其他线程只能等待。因此,synchronized语义就要求线程在访问读写共享变量时只能“串行”执行,因此synchronized具有有序性

可见性是指当一个线程修改了共享变量后,其他线程能够立即得知这个修改。

synchronized: 具有原子性,有序性和可见性
volatile:具有有序性和可见性
发表于 2020-11-11 10:12:31 回复(0)
发表于 2020-05-01 14:13:41 回复(0)
直接调用thread的run方法不会抛出异常,但是起不到多线程的作用
发表于 2020-11-05 23:14:40 回复(0)
volatile关键字是一种轻量级的同步机制,只保证数据的可见性,而不保证数据的原子性。
发表于 2020-02-15 11:54:12 回复(0)
评论第一复制的不全,看这里
编辑于 2020-02-29 17:48:26 回复(0)
直接调用run不会报异常。
发表于 2018-07-22 10:51:14 回复(0)
volatile只能保证可见性,不能保证原子性 synchronized既能保证可见性,又能保证原子性
发表于 2022-05-28 16:10:03 回复(0)
java中,volatile,synchronized,和,final 实现可见性,synchronized,lock,unlock操作保证了原子性,volatile,synchronized,两个关键字保证线程之间的操作是有序性的.
发表于 2022-01-25 20:25:49 回复(0)
volatile仅能实现变量的修改可见性,但不具备原子特性,而synchronized则可以保证变量的修改可见性和原子性. volatile不会造成线程的阻塞,而synchronized可能会造成线程的阻塞. volatile标记的变量不会被编译器优化,而synchronized标记的变量可以被编译器优化. Thread方法可以直接调用run方法, 但就起不到多线程的目的了。
编辑于 2021-09-05 21:37:39 回复(0)
syschronized可以保证可见性,又可以保证原子性,而volatile不能保证原子性!
发表于 2019-01-25 17:59:41 回复(0)
。。。依然记得书上说的 进程是程序的一次执行 进程不等于程序 b直接跳过了 结果它居然还是正确答案之一?
发表于 2018-11-08 14:59:36 回复(1)
D好奇怪啊 threadlocal对象是线程间共享的啊,只是每个线程在threadlocal对象中set进去的值是线程私有的 thread内部有个map,这个map是以threadlocal对象为key,set进去的值为value 这样才能达到通过相同的threadlocal对象get到不同的值的目的,很显然这个threadlocal是线程共享的 是我理解不对么?
编辑于 2017-10-17 09:43:45 回复(2)
xuy头像 xuy
A错误:
错在调用Thread的run方法不会抛出异常。
我们一般使用thread都是new一个线程,然后调用start方法启动,使用start方法才真正实现了多线程运行,thread线程有5种状态,创建-就绪-运行-阻塞-死亡,我们的start方法呢就是就绪这一步,因为这个时候我们的线程并没有立即的执行,而是得等待,等到我们的cpu有空闲的时候,才会执行线程里面的run方法,等run方法执行完了,线程就结束了。
直接使用thread执行run方***咋样呢?因为run方法是thread里面的一个普通的方法,所以我们直接调用run方法,这个时候它是会运行在我们的主线程中的,因为这个时候我们的程序中只有主线程一个线程,所以这样并没有做到多线程的这种目的。
B正确
C错误:volatile可以解决可见性问题,但是不能解决原子性问题,synchronized可以解决可见性和原子性问题
D:正确,ThreadLocal线程之间不共享
发表于 2023-03-09 06:15:03 回复(0)