赞
踩
在Java中,synchronized代码块一次只能由一个线程执行。 另外,java支持多线程并发执行。 这可能会导致两个或多个线程同时访问相同的字段或对象。
同步是使所有正在执行的并发线程保持同步的过程。 同步避免了由于共享内存视图不一致而导致的内存一致性错误。 当一个方法被声明为synchronzied时; 线程持有该方法对象的monitor或lock对象。 如果另一个线程正在执行同步方法,则您的线程将被阻塞,直到该线程释放监视器。
请注意,我们可以在类中定义的方法或块上使用synchronized关键字。 在类定义中,synchronized 关键字不能与变量或属性一起使用。
当我们想要同步非静态方法或非静态代码块时,对象级锁是一种机制,以便只有一个线程能够在给定的类实例上执行代码块。 应该始终这样做以确保实例级数据线程安全。
对象级锁定可以按如下方式完成:
- public class DemoClass
- {
- public synchronized void demoMethod(){}
- }
-
- or
-
- public class DemoClass
- {
- public void demoMethod(){
- synchronized (this)
- {
- //other thread safe code
- }
- }
- }
-
- or
-
- public class DemoClass
- {
- private final Object lock = new Object();
- public void demoMethod(){
- synchronized (lock)
- {
- //other thread safe code
- }
- }
- }
类级锁可防止多个线程在运行时进入该类的任何可用实例中的同步块。 这意味着如果在运行时有 100 个 DemoClass 实例,那么一次只有一个线程能够在任一实例中执行 demoMethod(),而所有其他实例将被其他线程锁定。
应始终执行类级锁定以确保静态数据线程安全。 我们知道 static 关键字将方法的数据与类级别关联,因此在静态字段或方法上使用锁定以使其在类级别上。
- public class DemoClass
- {
- //Method is static
- public synchronized static void demoMethod(){
-
- }
- }
-
- or
-
- public class DemoClass
- {
- public void demoMethod()
- {
- //Acquire lock on .class reference
- synchronized (DemoClass.class)
- {
- //other thread safe code
- }
- }
- }
-
- or
-
- public class DemoClass
- {
- private final static Object lock = new Object();
-
- public void demoMethod()
- {
- //Lock object is static
- synchronized (lock)
- {
- //other thread safe code
- }
- }
- }
参考资料
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。