多线程-synchronized锁在类级别和方法级执行结果的区别
2018-01-15 00:00
316 查看
synchronized 方法级别代码:
public class Thread1 { private int num = 0; public synchronized void printNum(String arg){ if (arg.equals("a")){ num = 100; System.out.println("num value is "+ num); try { new Thread().sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } }else { num = 200; System.out.println("num value is "+ num); } System.out.println("tag = " + arg + " num = " + num); } public static void main(String[] args) { final Thread1 t1 = new Thread1(); final Thread1 t2 = new Thread1(); Thread thread1 = new Thread(new Runnable() { @Override public void run() { t1.printNum("a"); } }); Thread thread2 = new Thread(new Runnable() { @Override public void run() { t2.printNum("b"); } }); thread1.start(); thread2.start(); } }
执行结果:
num value is 200 tag = b num = 200 num value is 100 tag = a num = 100
synchronized 类级别代码:
public class Thread1 { private static int num = 0; public static synchronized void printNum(String arg){ if (arg.equals("a")){ num = 100; System.out.println("num value is "+ num); try { new Thread().sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } }else { num = 200; System.out.println("num value is "+ num); } System.out.println("tag = " + arg + " num = " + num); } public static void main(String[] args) { final Thread1 t1 = new Thread1(); final Thread1 t2 = new Thread1(); Thread thread1 = new Thread(new Runnable() { @Override public void run() { t1.printNum("a"); } }); Thread thread2 = new Thread(new Runnable() { @Override public void run() { t2.printNum("b"); } }); thread1.start(); thread2.start(); } }
执行结果:
num value is 100 tag = a num = 100 num value is 200 tag = b num = 200
总结:
关键字synchronized取得的锁都试对象锁,而不是把一段代码(方法)当做锁,所以十里代码中哪个线程限制性synchronized关键字的方法,哪个线程就持有该方法所属对象的锁(Lock),两个对象,线程获得的就是两个不通的锁,他们互补影响。有一种情况则是相同的锁,即在静态方法上加synchronized关键字,表示锁定.class类,类一级别的锁(独占.class类)。
相关文章推荐
- 多线程-synchronized锁在类级别和方法级执行结果的区别
- 多线程下synchronized修饰static方法与非static方法的区别
- 多线程下synchronized修饰static方法与非static方法的区别
- Java多线程之Synchronized应用在static和非static方法上的区别
- java多线程下synchronized修饰static方法与非static方法的区别
- 多线程:synchronized同步方法和同步代码快的区别
- 多线程synchronized和synchronized static方法的区别
- 从头认识多线程-2.25 synchronized同步方法在jvm是怎样执行的?
- java多线程-synchronized对象和方法的区别
- 多线程下synchronized修饰static方法与非static方法的区别
- C#多线程编程之:集合类中Synchronized方法与SyncRoot属性原理分析(转)
- Firemonkey扩展增强:Android 浏览器执行JavaScript获取结果及JavaScript调用本地方法
- mysql在终端执行sql并把结果写入文件的方法
- 【Java面试题】26 多线程有几种实现方法?同步有几种实现方法? 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
- Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别?
- Java-多线程有序执行的方法
- 执行远程server上的命令并返回结果之两各方法
- java 多线程 Synchronized方法和方法块 synchronized(this)和synchronized(object)的理解
- 解决C、C++程序执行结果一闪而过的方法---system("pause")、getchar()、cin.get()
- easyUI的datagrid,当后台查询结果为空,不执行OnLoadSuccess方法的解决