多线程基础学习第二篇(多个线程多把锁)
来源:互联网 发布:列表是什么网络意思 编辑:程序博客网 时间:2024/06/13 09:09
多个线程同时竞争多把锁(这是对象上的锁,因为每个对象都有一把锁,所以彼此之间不存在关系)
/** * @version V1.0 * @Description: 多个线程同时竞争多把锁 * 在静态方法上加synchronize关键字,表示锁定.class类,类一级别的锁(独占.class类) * @Modified By:Ming Created in 14:39 2017/3/22 */public class MyThread1 { private int num = 0; /** * static **/ public synchronized void printNum(String tag) { try { if (tag.equals("a")) { num = 100; System.out.println("tag a, set num over!" ); Thread.sleep(1000); } else { num = 200; System.out.println("tag b, set num over!"); } System.out.println("tag " + tag + ", set num over!" + num); } catch (InterruptedException e) { e.printStackTrace(); } } //注意观察run方法的输出顺序 public static void main(String[] args) { //俩个不同的对象 final MyThread1 m1 = new MyThread1(); final MyThread1 m2 = new MyThread1(); Thread t1 = new Thread(new Runnable() { public void run() { m1.printNum("a"); } }); Thread t2 = new Thread(new Runnable() { public void run() { m2.printNum("b"); } }); t1.start(); t2.start(); }}tag a, set num over!tag b, set num over!tag b, set num over!200tag a, set num over!100
关键字synchronized取得的锁都是对象锁,而不是把一段代码(方法)当作锁,所以示例中的哪个线程先执行synchronized关键字的方法,哪个线程就持有该方法所属对象的锁(lock),如果是多个线程,那么线程获得的就是多个不同的锁,他们互不影响(但是有一种情况是相同的锁,即在静态方法上添加synchronized关键字,表示锁定.class,类一级别的锁,独占.class类)
(如果想要他们去竞争同一把锁的)加上静态修饰,变对象锁为类级别的锁
/** * @version V1.0 * @Description: 多个线程同时竞争多把锁 * 在静态方法上加synchronize关键字,表示锁定.class类,类一级别的锁(独占.class类) * @Modified By:Ming Created in 14:39 2017/3/22 */public class MyThread1 { private static int num = 0; /** * static **/ public static synchronized void printNum(String tag) { try { if (tag.equals("a")) { num = 100; System.out.println("tag a, set num over!" ); Thread.sleep(1000); } else { num = 200; System.out.println("tag b, set num over!"); } System.out.println("tag " + tag + ", set num over!" + num); } catch (InterruptedException e) { e.printStackTrace(); } } //注意观察run方法的输出顺序 public static void main(String[] args) { //俩个不同的对象 final MyThread1 m1 = new MyThread1(); final MyThread1 m2 = new MyThread1(); Thread t1 = new Thread(new Runnable() { public void run() { m1.printNum("a"); } }); Thread t2 = new Thread(new Runnable() { public void run() { m2.printNum("b"); } }); t1.start(); t2.start(); }}tag b, set num over!tag b, set num over!200tag a, set num over!tag a, set num over!100
0 0
- 多线程基础学习第二篇(多个线程多把锁)
- 架构师之路--线程基础--多个线程多把锁
- 多个线程多把锁
- 线程基础学习第一篇(多个线程竞争一把锁)
- 多线程(一):生成多个线程
- Linux多线程基础学习(五)线程同步-读写锁
- linux多线程学习(一)---线程基础
- java 基础学习之线程--多线程并发及线程锁
- 多线程学习笔记 线程基础
- C# 多线程编程基础——怎么创建和执行多个线程
- 多线程系列(二)---多个线程多个锁
- JAVA学习第二十八课(多线程(七))- 停止线程和多线程面试题
- Posix多线程编程学习笔记(一)—线程基础
- linux 学习- 编程基础之多线程编程(创建多线程)
- 多线程学习系列:(四)线程同步基础下
- 多线程学习系列:(六)线程池基础下
- Linux多线程基础学习(二)创建新的线程
- Linux多线程基础学习(三)线程生命周期
- 求最大公约数和最小公倍数(利用递归实现)
- 生成图片验证码
- C++作业3
- android防止按钮二次点击
- CCNA笔记
- 多线程基础学习第二篇(多个线程多把锁)
- vim 被加密了,解密
- Sqlmap注入技巧收集
- PAT (Advanced Level) Practise 1128 N Queens Puzzle (20)
- ubantu中用Python pip安装软件包是出现Pemirssion denied:dist-packages error解决方法
- H5基础第三课时(2)
- 04-树7 二叉搜索树的操作集
- Android:ListView.addHeaderView()用法及其注意事项
- 2017湖南多校第一场-Enterprising Escape