java中的线程同步实现法二(Synchronized 程序段)
2013-10-01 17:34
357 查看
一. 简要说明:
除了对方法进行Synchronized以便实现线程的同步之外,还可以对对象进行Synchronized的修饰,这种方式称为Synchronized程序段。此时,同一个对象的程序段一次只允许一个线程使用它。
二. 例子:
public class ThreadSyncObjTest implements Runnable {
private String str = new String();
private Integer delay = new Integer(1);
public static void main(String args[]) {
ThreadSyncObjTest r = new ThreadSyncObjTest();
Thread t;
for (int i=0; i<=2; i++) {
t = new Thread(r);
t.start();
}
System.out.println("end main");
}
public void run(){
for (int i = 0; i<=2; i++) {
//synchronized(System.out) {
//synchronized(str) {
synchronized(delay) { // 不能用基本类型
System.out.println(Thread.currentThread().getName());
System.out.println("count: "+ i);
}
}
}
}
三. 测试结果:
/*
Thread-0
count: 0
Thread-0
count: 1
Thread-0
count: 2
Thread-2
count: 0
Thread-2
count: 1
Thread-2
count: 2
end main
Thread-1
count: 0
Thread-1
count: 1
Thread-1
count: 2
*/
四. 说明:
1. 注意 end main的打印位置,由于这个线程是用户线程,所以,即使主程序结束,这个线程也可能没有结束。这在前前篇已经有详细的说明与举例。
2. 每个线程的两个打印语句总是两两显示在一起,没有出现混乱的现象。
3. synchronized后面括号中的不能是基本数据类型,必须是对象,当然,也可以是this。
除了对方法进行Synchronized以便实现线程的同步之外,还可以对对象进行Synchronized的修饰,这种方式称为Synchronized程序段。此时,同一个对象的程序段一次只允许一个线程使用它。
二. 例子:
public class ThreadSyncObjTest implements Runnable {
private String str = new String();
private Integer delay = new Integer(1);
public static void main(String args[]) {
ThreadSyncObjTest r = new ThreadSyncObjTest();
Thread t;
for (int i=0; i<=2; i++) {
t = new Thread(r);
t.start();
}
System.out.println("end main");
}
public void run(){
for (int i = 0; i<=2; i++) {
//synchronized(System.out) {
//synchronized(str) {
synchronized(delay) { // 不能用基本类型
System.out.println(Thread.currentThread().getName());
System.out.println("count: "+ i);
}
}
}
}
三. 测试结果:
/*
Thread-0
count: 0
Thread-0
count: 1
Thread-0
count: 2
Thread-2
count: 0
Thread-2
count: 1
Thread-2
count: 2
end main
Thread-1
count: 0
Thread-1
count: 1
Thread-1
count: 2
*/
四. 说明:
1. 注意 end main的打印位置,由于这个线程是用户线程,所以,即使主程序结束,这个线程也可能没有结束。这在前前篇已经有详细的说明与举例。
2. 每个线程的两个打印语句总是两两显示在一起,没有出现混乱的现象。
3. synchronized后面括号中的不能是基本数据类型,必须是对象,当然,也可以是this。
相关文章推荐
- java中synchronized关键字实现线程同步互斥(一)
- JAVA学习笔记--多线程(三)synchronized实现线程同步
- 【098】Java利用对象池配合synchronized同步块实现较高效率的线程同步
- java中的线程同步实现方法一(将方法设置为synchronized)
- Java并发编程:Synchronized及其实现原理
- Java并发编程:Synchronized及其实现原理
- Java线程(二):线程同步synchronized和volatile
- Java多线程编程-(13)-从volatile和synchronized的底层实现原理看Java虚拟机对锁优化所做的努力
- 如何使用java synchronized进行线程同步
- 【线程同步2】java实现生产者消费者问题$扩展,出现的问题,思考
- 【并发】死磕Java并发:深入分析synchronized的实现原理
- Java中synchronized的实现原理与应用
- 如何使用java synchronized进行线程同步
- Java并发编程:Synchronized及其实现原理
- 如何使用java synchronized进行线程同步
- Java线程(二):线程同步synchronized和volatile
- 如何实现多个线程同步 (2013-11-10 12:07:24)转载▼ 标签: it 在编写一个类时,如果该类中的代码可能运行于多线程环境下,那么就要考虑同步的问题,Java实现线程同步的方法很多
- Java中synchronized的实现原理与应用
- Java多线程笔记二(synchronized的使用以及实现原理)
- Java中的线程同步与ThreadLocal无锁化线程封闭实现