100分问一个线程同步问题,在线等.谢谢!
麻烦大家帮我看看,我已经在add上用了同步,为什么还是没效果,输出1010?
谢谢大家!
class A
{
public static int date=1000;//共享资源
}
class myThread extends Thread
{
public int mydate;
public int sleeptime;
public myThread(int sleeptime,String name)
{
super(name);
this.sleeptime=sleeptime;
}
public void run()
{
System.out.println(this.getName()+ "启动 ");
add();
System.out.println(this.getName()+ "结束 ");
}
public synchronized void add()
{
try
{
mydate=A.date;
System.out.println(this.getName()+ "的A.date= "+mydate);
Thread.sleep(1000*sleeptime); //睡眠sleeptime秒
mydate=mydate+10;
A.date=mydate;
}
catch(InterruptedException ie){ }
}
public static void main(String args[])
{
myThread t1=new myThread(6, "线程1 ");
myThread t2=new myThread(2, "线程2 ");
t1.start();
t2.start();
try
{ sleep(12000);
}catch(InterruptedException ie){}
System.out.println( "开始输出A.date ");
System.out.println(A.date);
}
}
[解决办法]
同步代码放在myThread 类里了,共享锁分别是myThread t1,myThread t2
所以没有达到同步效果,建议你在myThread放入一个共享变量,如static的
[解决办法]
public synchronized void add()
相当于
public void add(){
synchronized(this)//当前实例,
}
[解决办法]
某一线程add完A.date为1010,另一线程开始输出1010。
A.date在类加载后就已经存在,并不是和A的实例关联的。
[解决办法]
class A
{
public static int date=1000;//共享资源
}
class test extends Thread
{
public int mydate;
public int sleeptime;
A a;
public test(int sleeptime,String name,A a)
{
super(name);
this.sleeptime=sleeptime;
this.a=a;
}
public void run()
{
System.out.println(this.getName()+ "启动 ");
add();
System.out.println(this.getName()+ "结束 ");
}
public synchronized void add()
{
try
{
synchronized(a){
mydate=a.date;
System.out.println(this.getName()+ "的a.date= "+mydate);
Thread.sleep(1000*sleeptime); //睡眠sleeptime秒
mydate=mydate+10;
a.date=mydate;
}
}
catch(InterruptedException ie){ }
}
public static void main(String args[])
{
A a=new A();
test t1=new test(6, "线程1 ",a);
test t2=new test(2, "线程2 ",a);
t1.start();
t2.start();
try
{ sleep(12000);
}catch(InterruptedException ie){}
System.out.println( "开始输出A.date ");
System.out.println(A.date);
}
}
[解决办法]
楼主自己对比下
[解决办法]
对了 我test 里add方法的synchronized 也可以去掉 =》public void add()
[解决办法]
synchronized 修饰方法时候,锁定的对象是 this;
test t1=new test(6, "线程1 ",a);
test t2=new test(2, "线程2 ",a);
t1.start();
t2.start();
锁定的不是同一个对象t1.start(); 锁定的是t1 对象, t2.start(); 锁定的是t2 对象
可以同时执行 t1 data+10之前sleep 6秒 t2 读的是data 的初始值 1000
所以两个打印的都是 1000
[解决办法]
一个更好的处理多个线程共享一个数据源的方式:就是多个线程共享同一个Runnable接口,数据源由Runnable中的run来改变:
public class Synchronize implements Runnable {
public int data;
@Override
public void run() {
while (true) {
try {
Thread.sleep(500);
System.out.println(data++);
} catch(InterruptedException ex) {
System.out.println(ex.getMessage());
}
}
}
public static void main(String[] args) {
Runnable runnable = new Synchronize();
Thread thread1 = new Thread(runnable);
Thread thread2 = new Thread(runnable);
thread1.start();
thread2.start();
}
}