多线程的创建、volatile和synchronized的详细区别,原子性;创建线程的时候run()和start()的区别
时间: 2023-06-09 10:08:25 浏览: 95
多线程的创建需要继承Thread类或实现Runnable接口并重写run()方法。volatile是一种关键字,表示变量的值可能随时都会发生变化,因此使用volatile声明的变量可以在多线程环境中通过多个线程共享。而synchronized关键字则是用来解决多线程访问共享资源时产生的同步问题,它可以使得多个线程在并发访问时,保证共享资源的同步性。
原子性是指一个操作是不可中断的整体,要么全部执行成功,要么全部执行失败,不会出现执行了部分操作的情况。在多线程环境中,若多个线程同时执行某个操作,可能会存在竞争,从而出现执行了部分操作的情况。为了解决这个问题,Java提供了Atomic包,它封装了一些能够保证原子性的操作,如incrementAndGet()、decrementAndGet()、compareAndSet()等。
创建线程时,调用start()方法会将线程纳入操作系统进行调度,然后由操作系统在适当的时候启动该线程,并自动调用该线程的run()方法;而直接调用run()方法并不会启动新线程,而是在当前线程中直接调用run()方法执行。因此,我们通常应该调用start()方法来启动线程。
相关问题
volatile /synchronized 能保证原子性、有序性和可见性吗?
`synchronized` 能够保证原子性、有序性和可见性,但 `volatile` 只能保证可见性和有序性,不能保证原子性。
`synchronized` 关键字使用时,能够将代码块或者方法锁定,保证同一时间只有一个线程执行其中的代码,从而保证了原子性。同时,锁的释放和获取都会对内存进行同步操作,保证了可见性和有序性。
`volatile` 关键字则可以保证多线程之间的可见性和有序性,因为它会禁止指令重排,确保了指令的顺序,同时对于一个 volatile 变量的写操作会立即刷新到主内存中,对于读操作也会从主内存中读取最新的值,保证了可见性。但是,如果多个线程同时修改同一个 volatile 变量,由于没有锁的保护,就无法保证原子性。
volatile和synchronized的区别
volatile和synchronized都是Java中用于多线程编程的关键字,但它们的作用和使用方式有所不同。
volatile关键字用于保证变量的可见性和禁止指令重排序。当一个变量被声明为volatile时,每次读取该变量时都会从主内存中读取最新的值,每次修改该变量时都会立即写入主内存。这样可以保证多个线程对该变量的读写操作都是同步的,避免了线程之间的数据不一致问题。
synchronized关键字用于实现线程之间的同步,保证多个线程对共享资源的访问是有序的、互斥的。当一个线程获取了某个对象的锁时,其他线程必须等待该线程释放锁之后才能获取锁并访问共享资源。这样可以避免多个线程同时访问共享资源导致的数据不一致问题。
因此,volatile和synchronized的作用不同,volatile主要用于保证变量的可见性和禁止指令重排序,synchronized主要用于实现线程之间的同步。
阅读全文