Java并发编程:Synchronized及其实现原理

package com.paddx.test.concurrent;

public class SynchronizedTest {

public void method1(){

System.out.println(“Method 1 start”);

try {

System.out.println(“Method 1 execute”);

Thread.sleep(3000);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(“Method 1 end”);

}

public void method2(){

System.out.println(“Method 2 start”);

try {

System.out.println(“Method 2 execute”);

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(“Method 2 end”);

}

public static void main(String[] args) {

final SynchronizedTest test = new SynchronizedTest();

new Thread(new Runnable() {

@Override

public void run() {

test.method1();

}

}).start();

new Thread(new Runnable() {

@Override

public void run() {

test.method2();

}

}).start();

}

}

执行结果如下,线程1和线程2同时进入执行状态,线程2执行速度比线程1快,所以线程2先执行完成,这个过程中线程1和线程2是同时执行的。

Method 1 start

Method 1 execute

Method 2 start

Method 2 execute

Method 2 end

Method 1 end

2、对普通方法同步:

代码段二:

package com.paddx.test.concurrent;

public class SynchronizedTest {

public synchronized void method1(){

System.out.println(“Method 1 start”);

try {

System.out.println(“Method 1 execute”);

Thread.sleep(3000);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(“Method 1 end”);

}

public synchronized void method2(){

System.out.println(“Method 2 start”);

try {

System.out.println(“Method 2 execute”);

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(“Method 2 end”);

}

public static void main(String[] args) {

final SynchronizedTest test = new SynchronizedTest();

new Thread(new Runnable() {

@Override

public void run() {

test.method1();

}

}).start();

new Thread(new Runnable() {

@Override

public void run() {

test.method2();

}

}).start();

}

}

执行结果如下,跟代码段一比较,可以很明显的看出,线程2需要等待线程1的method1执行完成才能开始执行method2方法。

Method 1 start

Method 1 execute

Method 1 end

Method 2 start

Method 2 execute

Method 2 end

3、静态方法(类)同步

代码段三:

package com.paddx.test.concurrent;

public class SynchronizedTest {

public static synchronized void method1(){

System.out.println(“Method 1 start”);

try {

System.out.println(“Method 1 execute”);

Thread.sleep(3000);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(“Method 1 end”);

}

public static synchronized void method2(){

System.out.println(“Method 2 start”);

try {

System.out.println(“Method 2 execute”);

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(“Method 2 end”);

}

public static void main(String[] args) {

final SynchronizedTest test = new SynchronizedTest();

final SynchronizedTest test2 = new SynchronizedTest();

new Thread(new Runnable() {

@Override

public void run() {

test.method1();

}

}).start();

new Thread(new Runnable() {

@Override

public void run() {

test2.method2();

}

}).start();

}

}

执行结果如下,对静态方法的同步本质上是对类的同步(静态方法本质上是属于类的方法,而不是对象上的方法),所以即使test和test2属于不同的对象,但是它们都属于SynchronizedTest类的实例,所以也只能顺序的执行method1和method2,不能并发执行。

Method 1 start

Method 1 execute

Method 1 end

Method 2 start

Method 2 execute

Method 2 end

4、代码块同步

代码段四:

package com.paddx.test.concurrent;

public class SynchronizedTest {

public void method1(){

System.out.println(“Method 1 start”);

try {

synchronized (this) {

System.out.println(“Method 1 execute”);

Thread.sleep(3000);

}

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(“Method 1 end”);

}

public void method2(){

System.out.println(“Method 2 start”);

try {

synchronized (this) {

System.out.println(“Method 2 execute”);

Thread.sleep(1000);

}

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(“Method 2 end”);

}

public static void main(String[] args) {

final SynchronizedTest test = new SynchronizedTest();

new Thread(new Runnable() {

@Override

public void run() {

test.method1();

}

}).start();

new Thread(new Runnable() {

@Override

public void run() {

test.method2();

}

}).start();

}

}

最后总结

ActiveMQ+Kafka+RabbitMQ学习笔记PDF

image.png

  • RabbitMQ实战指南

image.png

  • 手写RocketMQ笔记

image.png

  • 手写“Kafka笔记”

image

关于分布式,限流+缓存+缓存,这三大技术(包含:ZooKeeper+Nginx+MongoDB+memcached+Redis+ActiveMQ+Kafka+RabbitMQ)等等。这些相关的面试也好,还有手写以及学习的笔记PDF,都是啃透分布式技术必不可少的宝藏。以上的每一个专题每一个小分类都有相关的介绍,并且小编也已经将其整理成PDF啦

}

}).start();

}

}

最后总结

ActiveMQ+Kafka+RabbitMQ学习笔记PDF

[外链图片转存中…(img-XS5OwEgW-1714366715097)]

  • RabbitMQ实战指南

[外链图片转存中…(img-aostnEIE-1714366715098)]

  • 手写RocketMQ笔记

[外链图片转存中…(img-jxILp9pq-1714366715098)]

  • 手写“Kafka笔记”

[外链图片转存中…(img-Hes2Cs2S-1714366715099)]

关于分布式,限流+缓存+缓存,这三大技术(包含:ZooKeeper+Nginx+MongoDB+memcached+Redis+ActiveMQ+Kafka+RabbitMQ)等等。这些相关的面试也好,还有手写以及学习的笔记PDF,都是啃透分布式技术必不可少的宝藏。以上的每一个专题每一个小分类都有相关的介绍,并且小编也已经将其整理成PDF啦

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 29
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值