在多线程并发编程中synchronized一直是元老级角色,很多人都会称呼它为重量级锁。但是,随着Java1.6对synchronized进行了各种优化之后,它的性能就得到了很大的提升(从java1.8的ConcurrentHashMap底层就可以猜到,新版的synchronized性能真的不差!),Java SE 1.6 中为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁。
Synchronized一句话来解释其作用就是:能够保证同一时刻最多只有一个线程执行该段代码,以达到并发安全的效果。也就是说Synchronized就好比是一把锁,某个线程把资源锁住了之后,别人就不能使用了,只有当这个线程用完了别人才能用。对于Synchronized关键字来说,它是并发编程中一个元老级角色,也就是说你只要学习并发编程,就必须要学习Synchronized关键字。由此可见其地位。
synchronized 有三种方式来加锁,分别是
1.修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁;
2.静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁;
3.修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码块前要获得给定对象的锁。 ps:不同的修饰,代表锁的控制粒度。
public class Demo {
private static int count = 0;
public static void inc() {
synchronized (Demo.class) {
try {
Thread.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
count++;
}
}
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 1000; i++) {
new Thread(() -> Demo.inc()).start();
}
Thread.sleep(3000);
System.out.println("运行结果" + count);
}
}
在上边的代码中我们可以看到仅仅通过一个关键字就能够实现多线程的互斥,那么为了实现线程的互斥特性,需要哪些因素和信息?
synchronized关键字贯穿了整个Java多线程的并发操作,想学好学精的小伙伴可以到动力节点在线观看免费的视频课程学习。
提枪策马乘胜追击04-21 20:01
代码小兵92504-17 16:07
代码小兵98804-25 13:57
杨晶珍05-11 14:54