我们简单给出三个思考问题:
// - 如果把 synchronized(obj) 放在 for 循环的外面,如何理解?-- 原子性会将for循环也作为原子性的一部分,会连续执行5000次之后才释放锁给另一个线程使用// - 如果 t1 synchronized(obj1) 而 t2 synchronized(obj2) 会怎样运作?-- 锁对象两个线程使用不同的锁,自然就对应不同的房间,不具有安全性// -如果 t1 synchronized(obj) 而 t2 没有加会怎么样?如何理解?-- 锁对象一个线程使用锁,另一个不使用,自然不具有互斥关系,不具有安全性
对象解决共享问题我们同样也可以直接采用一个类和synchronized搭配来解决共享问题// 我们自定义一个类,里面装有数据,我们采用synchronized解决共享问题class Room {// value值是属于room对象的int value = https://www.huyubaike.com/biancheng/0;// 这里的 synchronized 里面的 this 指的是创建的类的实际对象public void increment() {synchronized (this) {value++;}}public void decrement() {synchronized (this) {value--;}}public int get() {synchronized (this) {return value;}}}@Slf4jpublic class Test1 {public static void main(String[] args) throws InterruptedException {// 注意:这里线程1 , 2采用的是一个roon对象,所以他们的value值是共享的Room room = new Room();Thread t1 = new Thread(() -> {for (int j = 0; j < 5000; j++) {room.increment();}},"t1");Thread t2 = new Thread(() -> {for (int j = 0; j < 5000; j++) {room.decrement();}}, "t2");t1.start();t2.start();t1.join();t2.join();log.debug("count: {}" , room.get());}}
synchronized方法使用我们的synchronized有时也会用于类的方法中,具有不同的意义:// 首先是将synchronized放在普通的方法上:下面两个class是等价的,这里的this指的是对象本身class Test{public synchronized void test() {}}class Test{public void test() {synchronized(this) {}}}// 再者就是将synchronized放在静态方法上:下面两个class是等价的,这里的Test.class指的是类本身class Test{public synchronized static void test() {}}class Test{public static void test() {synchronized(Test.class) {}}}
"线程八锁"思考题我们来给出面试常用的线程八锁思考题来进行自身检测:/*第1题*/ @Slf4j(topic = "c.Number")class Number{public synchronized void a() {log.debug("1");}public synchronized void b() {log.debug("2");}}public static void main(String[] args) {Number n1 = new Number();new Thread(()->{ n1.a(); }).start();new Thread(()->{ n1.b(); }).start();}// 结果:1 , 2或2 , 1// 解析:两者都绑定n1对象锁,互斥关系/*第2题*/ @Slf4j(topic = "c.Number")class Number{public synchronized void a() {sleep(1);log.debug("1");}public synchronized void b() {log.debug("2");}}public static void main(String[] args) {Number n1 = new Number();new Thread(()->{ n1.a(); }).start();new Thread(()->{ n1.b(); }).start();}// 结果:1s后1,2或2,1s后1// 解析:两者都绑定n1对象锁,互斥关系;sleep不具有任何关系/*第3题*/ @Slf4j(topic = "c.Number")class Number{public synchronized void a() {sleep(1);log.debug("1");}public synchronized void b() {log.debug("2");}public void c() {log.debug("3");}}public static void main(String[] args) {Number n1 = new Number();new Thread(()->{ n1.a(); }).start();new Thread(()->{ n1.b(); }).start();new Thread(()->{ n1.c(); }).start();}// 结果:3 1s 12 或 23 1s 1 或 32 1s 1// 解析:a,b都是n1对象锁 , c不具有锁/*第4题*/ @Slf4j(topic = "c.Number")class Number{public synchronized void a() {sleep(1);log.debug("1");}public synchronized void b() {log.debug("2");}}public static void main(String[] args) {Number n1 = new Number();Number n2 = new Number();new Thread(()->{ n1.a(); }).start();new Thread(()->{ n2.b(); }).start();}// 结果:2 1s 后 1// 解析:a是n1的对象锁 , b是n2的对象锁,不具有互斥关系/*第5题*/ @Slf4j(topic = "c.Number")class Number{public static synchronized void a() {sleep(1);log.debug("1");}public synchronized void b() {log.debug("2");}}public static void main(String[] args) {Number n1 = new Number();new Thread(()->{ n1.a(); }).start();new Thread(()->{ n1.b(); }).start();}// 结果:2 1s 后 1// 解析:a采用类锁,b采用n1对象锁,不具有互斥关系/*第6题*/ @Slf4j(topic = "c.Number")class Number{public static synchronized void a() {sleep(1);log.debug("1");}public static synchronized void b() {log.debug("2");}}public static void main(String[] args) {Number n1 = new Number();new Thread(()->{ n1.a(); }).start();new Thread(()->{ n1.b(); }).start();}// 结果:1s 后12, 或 2 1s后 1// 解析:两者都是类锁,具有互斥关系/*第7题*/ @Slf4j(topic = "c.Number")class Number{public static synchronized void a() {sleep(1);log.debug("1");}public synchronized void b() {log.debug("2");}}public static void main(String[] args) {Number n1 = new Number();Number n2 = new Number();new Thread(()->{ n1.a(); }).start();new Thread(()->{ n2.b(); }).start();}// 结果:2 1s 后 1// 解析:a采用类锁,b采用n2对象锁,不具有互斥关系/*第8题*/ @Slf4j(topic = "c.Number")class Number{public static synchronized void a() {sleep(1);log.debug("1");}public static synchronized void b() {log.debug("2");}}public static void main(String[] args) {Number n1 = new Number();Number n2 = new Number();new Thread(()->{ n1.a(); }).start();new Thread(()->{ n2.b(); }).start();}// 结果:1s 后12,或 2 1s后 1// 解析:两者都是类锁,具有互斥关系
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Seata Server 1.5.2 源码学习
- 2022极端高温!机器学习如何预测森林火灾?? 万物AI
- 1.nginx学习
- 常用Python库整理
- 图学习参考资料 词向量word2vec
- 五 RK3568开发笔记:在虚拟机上使用SDK编译制作uboot、kernel和ubuntu镜像
- realme笔记本最新消息_realme笔记本即将发布
- JUC学习笔记——进程与线程
- Seata 1.5.2 源码学习
- 第4版 高性能MySQL 第一章 MySQL架构 读书笔记