Java 关键字volatile与synchronized的作用与区别

volatile与synchronized的作用与区别

一、volatile的用法与作用
用来修饰变量例如:Thread类里面的表示名字的字符数组
在这里插入图片描述
其作用是保证数据的可见性和有序性,但它并不能保证数据的原子性

顺便提一下。什么叫原子性?原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。

因为volatile不能保证原子性,所以就引出了下面一个关键字 synchronized

二、synchronized的用法与作用
它用于修饰代码块和方法,可以弥补volatile关键字的不足,即它能保证对数据操作的原子性,在多个线程对数据进行操作时,保证线程的安全

synchronized提供了两种特性:互斥性和可见性
互斥性:如果将锁加在某个变量上,则每次只有一个线程能够使用该共享数据,直到该线程使用完才会将该共享数据释放,供其它线程使用。

可见性:线程在得到锁时读入副本,释放时写回内存。

下面是卖票的案例:

package com.dxx.synchroniz;

public class Task implements Runnable {

	boolean flag = false;
	int num = 5000;

	@Override
	public void run() {
		for (int i = 0; i < 100; i++) {
			try {
				Thread.sleep(50);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			if (flag) {
				synchronized ("a") {
					if (num > 0) {
						System.out.println(Thread.currentThread() + "--同步代码块卖票--" + num--);
					}
				}
			} else {
				sell();
			}

		}

	}

	// 同步方法
	public synchronized void sell() {
		if (num > 0) {
			System.out.println(Thread.currentThread() + "--同步方法中卖票--" + num--);
		}
	}

}

控制台显示:

在这里插入图片描述

总结

综上所述,volatile与synchronized与区别如下:
1.修饰对象不同,volatile用于修饰变量,synchronized用与对语句和方法加锁;
2.各自作用不同,volatile保证数据的可见性和有序性,但它并不能保证数据的原子性,synchronized可以保证原子性;
3.volatile不会造成线程堵塞,而synchronized会造成线程堵塞;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值