同步代码块和同步方法有什么区别

相同点:

同步方法就是在方法前加关键字 synchronized,然后被同步的方法 一次只 能有一个线程进入 其他线程等待 。    而同步代码块则是在方法内部使用大括号使得一个代码块得到同步。 同步代码块会有一个同步的“目标” ,使得同步块更加灵活一些 (同步代码块可以通过“目标”决定需要锁定的对象)。 一般情况下,如果此“目标”为 this(我觉得),同步方法和代码块没有太大的区别。
区别:
同步方法直接 在方法上 加 synchronized 实现加锁,同步代码块则 在方法内部 加锁。很明显, 同步方法锁的范围比较大,而同步代码块范围要小点 。一般同步的范围越大,性能就越差。所以一般需要加锁进行同步的时候,范围越小越好,这样性能更好。
  1. 范围不同:

    • 同步代码块:使用synchronized关键字将一段代码块标记为同步代码块。只有当一个线程获得了对象锁时,才能执行该代码块。
    • 同步方法:使用synchronized关键字修饰方法。当一个线程调用同步方法时,它将自动获取方法所属对象的锁,并在方法执行期间持有该锁。
  2. 锁的粒度不同:

    • 同步代码块:可以选择在关键代码块中使用不同的对象作为锁,从而实现细粒度的锁定,不仅可以保护共享数据,而且可以提高程序性能。
    • 同步方法:使用synchronized修饰的方法将会锁定整个方法,这意味着其他线程无法同时访问该对象的其他同步方法。
  3. 使用方式不同:

    • 同步代码块:使用synchronized关键字,并指定一个对象作为锁。可以使用任何对象(包括this关键字)作为锁。
    • 同步方法:直接在方法签名中使用synchronized关键字,无需指定锁对象。锁对象为该方法所属对象。

总的来说,同步代码块允许细粒度(粒度小)的控制锁定范围,并且可以使用不同的对象锁来实现。而同步方法更简单,但锁定的粒度较粗(粒度大)。选择使用哪种方式取决于你的需求和设计。

假设你和你的朋友一起去参加一个派对。在派对上,存在一个共享资源,就是食物台上的一盘蛋糕。你和你的朋友都很喜欢吃蛋糕,为了避免争抢蛋糕导致混乱,你们需要采取一种方式来保证每个人都能有机会安全地分到蛋糕。这里,同步代码块和同步方法的区别可以通过以下的例子来解释:

  1. 同步代码块的例子: 点

你和你的朋友们约定使用多把锁来实现分蛋糕的过程。当你们想要拿蛋糕时,会根据自己的编号一一分别有序的拿起手中的锁。只有当拿到锁的人才能取走蛋糕,其他人必须等待。这样,你们每个人都有机会按顺序安全地拿到蛋糕,避免了争抢的情况。

  1. 同步方法的例子: 线

你们约定使用一把锁,这把锁可以是一个标志物,比如一块小旗帜。当你们想要拿蛋糕时,必须依次拿起这块旗帜,然后按照顺序一个一个地去取蛋糕。只有等到前面的人取完蛋糕后,旗帜才会传给下一个人这样,你们每个人都有机会顺序地取蛋糕,而且只有拿到旗帜的人才能取蛋糕,避免了争抢的情况。

总结起来,同步代码块和同步方法都可以实现资源的安全访问,类似于上述例子中使用的锁和旗帜。同步代码块更适合处理对特定代码块的同步,适合精细控制资源的访问。而同步方法更适合对整个方法进行同步,简单方便,但锁的粒度较粗。

同步(一一排队 等A完成在执行B...)

异步(不排队  将A运行后同时立马去执行B...)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值