线程同步 - 几乎相同的表达式但不同的结果
Thread synchronizing - almost same expressions but different result
public class MythreadM {
public static void main(String[] args) {
// TODO Auto-generated method stub
Msg m = new Msg();
Mythread thread1 = new Mythread(m);
thread1.start();
Mythread thread2 = new Mythread(m);
thread2.start();
Mythread thread3 = new Mythread(m);
thread3.start();
}
}
class Mythread extends Thread
{
private Msg m;
Mythread(Msg m)
{
this.m = m;
}
public void run()
{
System.out.println(getName()+"start");
for(int i=0; i<300; i++)
{
processMsg(i);
}
}
synchronized void processMsg(int i) // here starts question.
{
// synchronized(m)
{
m.write(getName()+" message "+i);
try {
sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
m.print();
}
}
}
class Msg
{
String str = "def message";
void print()
{
System.out.println(str+" "+System.currentTimeMillis());
}
void write(String str)
{
this.str = str;
}
}
上面的完整代码----------------
以及以下3个几乎相同表达式的代码
<<代码 1>>:同步(m){}
void processMsg(int i)
{
synchronized(m)
{
m.write(getName()+" message "+i);
try {
sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
m.print();
}
}
<<代码 2>>:同步无效 processMsg(int i)
synchronized void processMsg(int i)
{
{
m.write(getName()+" message "+i);
try {
sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
m.print();
}
}
这些代码看起来意思相同,只是表达方式不同,但作用不同。
<代码 2> 未同步,打印非同步结果。
为什么会这样?
sleep(1);
的 目的 是什么?
提前致谢。
这似乎是示例代码,用于演示当对所有线程 (m) 共有的对象进行同步时,一次只有一个线程可以使用它,而不是在线程中同步一个方法时,它什么都不做,因为每个线程都有自己的锁。
关于你的第二个问题,sleep(1)的意思是当前线程应该等待至少 1毫秒才能继续。
最后,根据我的经验,当您有多个线程在同一资源之后(尤其是 System.out 之类的 (Print)stream)时,解决此问题的最佳方法是使用消息队列同步发出的消息。
public class MythreadM {
public static void main(String[] args) {
// TODO Auto-generated method stub
Msg m = new Msg();
Mythread thread1 = new Mythread(m);
thread1.start();
Mythread thread2 = new Mythread(m);
thread2.start();
Mythread thread3 = new Mythread(m);
thread3.start();
}
}
class Mythread extends Thread
{
private Msg m;
Mythread(Msg m)
{
this.m = m;
}
public void run()
{
System.out.println(getName()+"start");
for(int i=0; i<300; i++)
{
processMsg(i);
}
}
synchronized void processMsg(int i) // here starts question.
{
// synchronized(m)
{
m.write(getName()+" message "+i);
try {
sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
m.print();
}
}
}
class Msg
{
String str = "def message";
void print()
{
System.out.println(str+" "+System.currentTimeMillis());
}
void write(String str)
{
this.str = str;
}
}
上面的完整代码----------------
以及以下3个几乎相同表达式的代码
<<代码 1>>:同步(m){}
void processMsg(int i)
{
synchronized(m)
{
m.write(getName()+" message "+i);
try {
sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
m.print();
}
}
<<代码 2>>:同步无效 processMsg(int i)
synchronized void processMsg(int i)
{
{
m.write(getName()+" message "+i);
try {
sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
m.print();
}
}
这些代码看起来意思相同,只是表达方式不同,但作用不同。
<代码 2> 未同步,打印非同步结果。
为什么会这样?
sleep(1);
的 目的 是什么?
提前致谢。
这似乎是示例代码,用于演示当对所有线程 (m) 共有的对象进行同步时,一次只有一个线程可以使用它,而不是在线程中同步一个方法时,它什么都不做,因为每个线程都有自己的锁。
关于你的第二个问题,sleep(1)的意思是当前线程应该等待至少 1毫秒才能继续。
最后,根据我的经验,当您有多个线程在同一资源之后(尤其是 System.out 之类的 (Print)stream)时,解决此问题的最佳方法是使用消息队列同步发出的消息。