“线程在使用资源的前后可以给该资源上锁和开锁。假想给复印机上锁,任一时刻只有一个职员拥有钥匙。若没有钥匙就不能使用复印机。给共享变量上锁就使得 Java 线程能够快速方便地通信和同步。某个线程若给一个对象上了锁,就可以知道没有其他线程能够访问该对象。即使在抢占式模型中,其他线程也不能够访问此对象,直到上锁的线程被唤醒、完成工作并开锁。那些试图访问一个上锁对象的线程通常会进入睡眠状态,直到上锁的线程开锁。一旦锁被打开,这些睡眠进程就会被唤醒并移到准备就绪队列中。”synchronized 关键字可以用来上锁,但 似乎无法锁定一个继承了thread的对象的活动。
如下,大家可以看到,主线程调用TestThread2的show,whichis synchronized ,但却可以与run并发执行,高手来给解释一下package thread;public class TestSyn { public static void main(String[] args) throws Exception { TestThread2 a=new TestThread2();
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
a.start();
a.show();
//System.out.println("Doing something...");
System.exit(0);
}
public static int test=0;
public static int test2=0;
}class TestThread2 extends Thread {
public synchronized void show()
{
System.out.println("call by another thread");
for (int i=0;i<1000;i++){
System.out.println("***********"+TestSyn.test+" "+TestSyn.test2);
TestSyn.test++;
}
/*
try {
Thread.sleep(1000);
} catch (Exception e) {
System.out.println("good");
}*/
}
@Override
public void run() {
for (int i=0;i<1000;i++){
System.out.println("in TestThread"+TestSyn.test+" "+TestSyn.test2);
TestSyn.test2++; } }
}
如下,大家可以看到,主线程调用TestThread2的show,whichis synchronized ,但却可以与run并发执行,高手来给解释一下package thread;public class TestSyn { public static void main(String[] args) throws Exception { TestThread2 a=new TestThread2();
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
a.start();
a.show();
//System.out.println("Doing something...");
System.exit(0);
}
public static int test=0;
public static int test2=0;
}class TestThread2 extends Thread {
public synchronized void show()
{
System.out.println("call by another thread");
for (int i=0;i<1000;i++){
System.out.println("***********"+TestSyn.test+" "+TestSyn.test2);
TestSyn.test++;
}
/*
try {
Thread.sleep(1000);
} catch (Exception e) {
System.out.println("good");
}*/
}
@Override
public void run() {
for (int i=0;i<1000;i++){
System.out.println("in TestThread"+TestSyn.test+" "+TestSyn.test2);
TestSyn.test2++; } }
}
解决方案 »
- 如何能在SOCKET发送下一步命令前先清除读取缓冲
- 字符串的截取
- 遇到一种奇怪的方式,同时extends Thread与implements Runnable,这时怎么处理呢?请教各位老师
- 一个类初始化问题~谢谢了
- 问下 LIST() 的用法 API上的解释看不懂
- 请问我如果用jdk1.5,tomcat5.5开发,那么hibernate,spring,struts有支持jdk1.5的版了吗
- 向大家请教一下本人学JNI的时候遇到问题。
- 用JB9的Executable Builder生成的.exe文件,还是不能独立运行。
- 关于UML问题
- [Good News]随着IBM WSAD 5.1的推出,eclipse 2.1.x的多语言包也有了!
- 用线程交换打印#和&
- 怎样使jComboBox不可用,但内容不变灰
楼主【denverbenjamin2000】截止到2008-07-16 16:52:40的历史汇总数据(不包括此帖):
发帖的总数量:18 发帖的总分数:1490 每贴平均分数:82
回帖的总数量:28 得分贴总数量:3 回帖的得分率:10%
结贴的总数量:14 结贴的总分数:1190
无满意结贴数:0 无满意结贴分:0
未结的帖子数:4 未结的总分数:300
结贴的百分比:77.78 % 结分的百分比:79.87 %
无满意结贴率:0.00 % 无满意结分率:0.00 %
楼主加油
看懂了再来叽叽歪歪
啥都不懂 整天就知道发个乱七八糟的帖
我的理解是:
show()当然可以和run()同时执行了。
如果有两个线程都拥有TestThread2的引用。
当这两个线程都同时执行TestThread2.show()的时候,就只有一个线程能执行。因为show()是synchronized
now I am starting to read
Concurrent and Real-Time Programming in Java
Andy Wellings University of York, UKThanks for all your help:)
对synchronized(this)的一些理解
发表于:2005年7月1日 来自:java中文站 阅读: 19次
一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。
Java对多线程的支持与同步机制深受大家的喜爱,似乎看起来使用了synchronized关键字就可以轻松地解决多线程共享数据同步问题。到底如何?――还得对synchronized关键字的作用进行深入了解才可定论。
总的说来,synchronized关键字可以作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块。如果再细的分类, synchronized可作用于instance变量、object reference(对象引用)、static函数和class literals(类名称字面常量)身上。
在进一步阐述之前,我们需要明确几点:
A.无论synchronized关键字加在方法上还是对象上,它取得的锁都是对象,而不是把一段代码或函数当作锁――而且同步方法很可能还会被其他线程的对象访问。
B.每个对象只有一个锁(lock)与之相关联。
C.实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。