一、Java并发编程基础篇(002)对象锁、类锁
来源:互联网 发布:极坐标 知乎 编辑:程序博客网 时间:2024/06/14 18:29
package com.bjsxt.base.sync002;
/**
* 关键字synchronized取得的锁都是对象锁,而不是把一段代码(方法)当做锁,
* 所以代码中哪个线程先执行synchronized关键字的方法,哪个线程就持有该方法所属对象的锁(Lock),
*
* 在静态方法上加synchronized关键字,表示锁定.class类,类一级别的锁(独占.class类)。
* 总结:上面的方法和变量如果不加static,那么两个线程就可以同时进入该方法,这样就会出现并发问题。
* 如果加上static关键字,那么线程1调用该方法的时候,那么线程2必须等待线程1释放锁后才可以进入该方法,这样就避免了并发,
* static和synchronized组合的方法就是独占类。
* @author alienware
*
*/
public class MultiThread {
/** static */
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 + ", num = " + num);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//注意观察run方法输出顺序
public static void main(String[] args) {
//俩个不同的对象
final MultiThread m1 = new MultiThread();
final MultiThread m2 = new MultiThread();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
m1.printNum("a");
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
m2.printNum("b");
}
});
t1.start();
t2.start();
}
}
/**
* 关键字synchronized取得的锁都是对象锁,而不是把一段代码(方法)当做锁,
* 所以代码中哪个线程先执行synchronized关键字的方法,哪个线程就持有该方法所属对象的锁(Lock),
*
* 在静态方法上加synchronized关键字,表示锁定.class类,类一级别的锁(独占.class类)。
* 总结:上面的方法和变量如果不加static,那么两个线程就可以同时进入该方法,这样就会出现并发问题。
* 如果加上static关键字,那么线程1调用该方法的时候,那么线程2必须等待线程1释放锁后才可以进入该方法,这样就避免了并发,
* static和synchronized组合的方法就是独占类。
* @author alienware
*
*/
public class MultiThread {
/** static */
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 + ", num = " + num);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//注意观察run方法输出顺序
public static void main(String[] args) {
//俩个不同的对象
final MultiThread m1 = new MultiThread();
final MultiThread m2 = new MultiThread();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
m1.printNum("a");
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
m2.printNum("b");
}
});
t1.start();
t2.start();
}
}
阅读全文
0 0
- 一、Java并发编程基础篇(002)对象锁、类锁
- Java并发编程基础(一)
- 一、Java并发编程基础篇(001)synchronized
- 一、Java并发编程基础篇(003)同步异步
- 一、Java并发编程基础篇(004)脏读
- Java 并发编程 基础 一
- 【Java并发编程】一.基础
- 《java并发编程实战》基础构建模块(一)
- Java并发编程(1)一基础类和接口
- 深入学习java并发编程:内存模型(一)基础
- java并发编程之线程同步基础(一)
- java并发编程(一基本概念、线程基础)
- java并发编程实践学习(一)java的类锁和对象锁
- java并发编程(一)
- Java并发编程(一)
- Java基础--并发编程基础(1)
- Java基础--并发编程基础(2)
- Java基础--并发编程基础(3)
- golang-redis之hash类型简单操作
- 十.ARM裸机学习之中断系统1(S5PV210的中断系统详解)
- 自己动手构造编译原理 & CSAPP 笔记
- 单列集合ArrayList
- "自顶向下,逐步求精" ——程序结构化设计方法
- 一、Java并发编程基础篇(002)对象锁、类锁
- 姿态论文整理--05-Learning feature pyramids for human pose estimation
- 【java学习记】String常用方法
- 基础算法学习第一天(快速排序算法)
- codeforces 282A Bit++
- 数据结构-二叉搜索树
- 算法学习
- hdu Climbing Worm
- svn配置相关