java多线程如何解决同步的安全问题
importjava.util.*;publicclassTest{publicstaticinti=0;publicstaticchar[]b="1234567890"...
import java.util.*;
public class Test{
public static int i = 0;
public static char[] b = "1234567890".toCharArray();
public static int len = "1234567890".length();
//public static String[] b;
public static void main(String[] args){
moreProc mp1 = new moreProc();
new Thread(mp1).start();
moreProc mp2 = new moreProc();
new Thread(mp2).start();
}
}
class moreProc implements Runnable {
@Override
public synchronized void run() {
while(Test.i < Test.len){
//System.out.println(Test.i);
prin(Test.i);
Test.i++;
}
try {
// 挂起随机时间
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public synchronized void prin(int i){
System.out.println(Thread.currentThread().getName()+"------"+Test.b[i]);
}
}
输出的结果中却又以下结果:
Thread-0------1
Thread-1------1
请问下该如何解决? 展开
public class Test{
public static int i = 0;
public static char[] b = "1234567890".toCharArray();
public static int len = "1234567890".length();
//public static String[] b;
public static void main(String[] args){
moreProc mp1 = new moreProc();
new Thread(mp1).start();
moreProc mp2 = new moreProc();
new Thread(mp2).start();
}
}
class moreProc implements Runnable {
@Override
public synchronized void run() {
while(Test.i < Test.len){
//System.out.println(Test.i);
prin(Test.i);
Test.i++;
}
try {
// 挂起随机时间
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public synchronized void prin(int i){
System.out.println(Thread.currentThread().getName()+"------"+Test.b[i]);
}
}
输出的结果中却又以下结果:
Thread-0------1
Thread-1------1
请问下该如何解决? 展开
5个回答
2014-01-13
展开全部
理解一下生产者和消费者的这个线程同步例子
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
while(Test.i < Test.len){
/念型/扒纯System.out.println(Test.i);
prin(Test.i++);
// Test.i++;
}
这春高咐样试试
/念型/扒纯System.out.println(Test.i);
prin(Test.i++);
// Test.i++;
}
这春高咐样试试
追问
这个可以了!能麻烦解释下吗?
追答
不好意思啊,我也是一知半解,现在也还在学,不过上面这个应该没怎么用上共享数据吧,或者线程同步。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
Test.i++;也封装进prin(int i)方法里试试
更多追问追答
追问
不行,结果还是那样
追答
将prin(int i)方法写进Test,写成静态Test.prin()参数不要了直接用Test.i
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询