文章目录
一、synchronized关键字三大特性?
1.1 原子性
一个或多个操作要么全部执行成功,要么全部执行失败。synchronized关键字可以保证只有一个线程拿到锁,访问共享资源。
1.2 可见性
当一个线程对共享变量进行修改后,其他线程可以立刻看到。执行synchronized时,会对应执行 lock、unlock原子操作,保证可见性。
1.3 有序性
CPU为了优化我们的代码,会对我们程序进行重排序,执行synchronized时,程序的执行顺序会按照代码的先后顺序执行。
二 、synchronized关键字实现什么类型的锁?
2.1 悲观锁
synchronized实现的是悲观锁,每次访问共享资源时都会上锁。
2.2 非公平锁
synchronized关实现的是非公平锁,即线程获取锁的顺序并不一定是按照线程阻塞的顺序
2.3 可重入锁
synchronized关键字实现的是可重入锁,即已经获取锁的线程可以再次获取锁。
2.4 独占锁或者排他锁
synchronized关键字实现的是独占锁,即该锁只能被一个线程所持有,其他线程均被阻塞。
三、synchronized的使用场景
3.1 synchronized的使用场景介绍
在java代码中使用synchronized可是使用在代码块和方法中,根据Synchronized用的位置可以有这些使用场景
3.2 synchronized的使用场景入门
3.2.1 synchronized修饰实例方法
修饰实例方法,对当前实例对象this加锁,进入同步代码前要获得当前实例的锁,下面看一段代码,大家可以猜想下输出结果
public class SynchronizedDemo implements Runnable{
//创建共享变量
static int i = 0;
public static void main(String[] args) throws InterruptedException {
SynchronizedDemo s1 = new SynchronizedDemo();
Thread t1 = new Thread(s1);
Thread t2 = new Thread(s1);
t1.start();
t2.start();
t1.join();
t2.join();
}
//synchronized修饰实例方法
public synchronized void m1(){
System.out.println("当前线程名称:"
+Thread.currentThread()+",i="+i++);
}
@Override
public void run() {
for (int i = 0