验证synchronized方法对同对象中方法的影响

验证多个线程访问一个对象,其中m1加synchronized,m2不加,其他线程可否在m1被访问时访问m2?


/**
 * 验证多个线程访问一个对象,其中m1加synchronized,m2不加,其他线程可否在m1被访问时访问m2?
 */
public class SynchronizedMethodTest {
    public static void main(String[] args) {
        Obj obj = new Obj();
        new Thread(obj::m1,"T1").start();
        new Thread(obj::m2,"T2").start();
    }
}

class Obj {
    public synchronized void m1() {
        System.out.println(Thread.currentThread().getName()+"m1 start ..... ");
        try {
            Thread.sleep(10000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+"m1 end ..... ");
    }

    public void m2() {
        System.out.println(Thread.currentThread().getName()+"m2 start ..... ");
        try {
            Thread.sleep(1000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+"m2 end ..... ");
    }
}

输出

T1m1 start ..... 
T2m2 start ..... 
T2m2 end ..... 
T1m1 end ..... 

结论:不会影响
生产中存在脏读(dirtyRead);
如:写(m1)加锁,读(m2)不加锁

以下是验证对象锁特点的代码示例,你可以将其保存为一个压缩包并下载: ```java // ObjectLockExample.java public class ObjectLockExample { public static void main(String[] args) { ObjectLockExample example = new ObjectLockExample(); Thread thread1 = new Thread(() -> example.method1()); Thread thread2 = new Thread(() -> example.method2()); Thread thread3 = new Thread(() -> example.method3()); thread1.start(); thread2.start(); thread3.start(); } public synchronized void method1() { System.out.println("Method 1 - Start"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Method 1 - End"); } public void method2() { synchronized (this) { System.out.println("Method 2 - Start"); System.out.println("Method 2 - End"); } } public void method3() { System.out.println("Method 3 - Start"); System.out.println("Method 3 - End"); } } ``` 这个示例代码展示了对象锁的三个特点: 1. 对于不同对象对象锁没有作用:在`ObjectLockExample`创建了一个实例`example`,然后启动了三个线程分别调用`method1`、`method2`和`method3`方法。由于这三个线程操作的是同一个实例`example`,所以对象起作用,但如果使用不同的实例则对象锁不影响彼此。 2. 当一个线程访问`synchronized`修饰的成员方法或者修饰的代码块时,其他线程无法访问`synchronized`修饰的其他成员方法或修饰的其他代码块:在`method1`使用了`synchronized`修饰整个方法,因此一旦线程获取到对象锁,其他线程无法同时访问该方法。在`method2`使用了`synchronized`修饰代码块,同样对其他线程产生阻塞。 3. 但是对没有`synchronized`修饰的其他方法没有效果:在`method3`没有使用`synchronized`修饰,所以即使其他线程在访问带有对象锁的方法时被阻塞,仍然可以同时访问没有对象锁的方法。 你可以将以上代码保存为一个Java文件并编译运行,然后将编译后的class文件和源代码文件打包成一个压缩包进行发送。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值