公司的网站建设费做什么费用,青岛城阳网站设计,网上商店有哪些,加盟项目2023推荐问题的由来#xff1a;
看到这样一个面试题#xff1a;
? 1 2 3 4 5 6 //下列两个方法有什么区别 public synchronized void method1(){} public void method2(){ synchronized (obj){} }
synchronized用于解决同步问题#xff0c;当有多条线程同时访问共享数据时
看到这样一个面试题
? 1 2 3 4 5 6 //下列两个方法有什么区别 public synchronized void method1(){} public void method2(){ synchronized (obj){} }
synchronized用于解决同步问题当有多条线程同时访问共享数据时如果进行同步就会发生错误Java提供的解决方案是只要将操作共享数据的语句在某一时段让一个线程执行完在执行过程中其他线程不能进来执行可以。解决这个问题。这里在用synchronized时会有两种方式一种是上面的同步方法即用synchronized来修饰方法另一种是提供的同步代码块。
这里总感觉怪怪的这两种方法有什么区别呢基础学得不好于是就动手做了个简单的测试代码如下
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 public class SynObj { public synchronized void methodA() { System.out.println(methodA.....); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } public void methodB() { synchronized(this) { System.out.pritntln(methodB.....); } } public void methodC() { String str sss; synchronized (str) { System.out.println( methodC.....); } } } ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 public class TestSyn { public static void main(String[] args) { final SynObj obj new SynObj(); Thread t1 new Thread(new Runnable() { Override public void run() { obj.methodA(); } }); t1.start(); Thread t2 new Thread(new Runnable() { Override public void run() { obj.methodB(); } }); t2.start(); Thread t3 new Thread(new Runnable() { Override public void run() { obj.methodC(); } }); t3.start(); } }
这段小代码片段打印结果如下
? 1 2 3 4 methodA..... methodC..... //methodB会隔一段时间才会打印出来 methodB.....
这段代码的打印结果是methodA…..methodC…..会很快打印出来methodB…..会隔一段时间才打印出来那么methodB为什么不能像methodC那样很快被调用呢
在启动线程1调用方法A后接着会让线程1休眠5秒钟这时会调用方法C注意到方法C这里用synchronized进行加锁这里锁的对象是str这个字符串对象。但是方法B则不同是用当前对象this进行加锁注意到方法A直接在方法上加synchronized这个加锁的对象是什么呢显然这两个方法用的是一把锁。
*由这样的结果我们就知道这样同步方法是用什么加锁的了由于线程1在休眠这时锁还没释放导致线程2只有在5秒之后才能调用方法B由此可知两种加锁机制用的是同一个锁对象即当前对象。
另外同步方法直接在方法上加synchronized实现加锁同步代码块则在方法内部加锁很明显同步方法锁的范围比较大而同步代码块范围要小点一般同步的范围越大性能就越差一般需要加锁进行同步的时候肯定是范围越小越好这样性能更好*。
感谢阅读希望能帮助到大家谢谢大家对本站的支持