多线程类代码:
public class Number implements Runnable {
private String symbol;
private int num;
int data = 0;
/**
*
* @param symbol符号
* @param num数值
/
public Number(String symbol, int num) {
super();
this.symbol = symbol;
this.num = num;
}
@Override
public void run() {
synchronized (this) {
switch(symbol) {
case "+":
data += num;
break;
case "":
data *= num;
break;
case "/":
data /= num;
break;
}
System.out.println("数据源发生变化,变化后的数字是:" + data);
}
}
}
测试类代码:
public class Test {
public static void main(String[] args) {
Number num1 = new Number("+", 10); //线程1 加10
Number num2 = new Number("+", 20); //线程2 加20
Number num3 = new Number("*", 3); //线程3 乘3
Number num4 = new Number("/", 4); //线程4 除以4
new Thread(num1).start();
new Thread(num2).start();
new Thread(num3).start();
new Thread(num4).start();
}
}
控制台输出:
数据源发生变化,变化后的数字是:10
数据源发生变化,变化后的数字是:0
数据源发生变化,变化后的数字是:20
数据源发生变化,变化后的数字是:0
不知道为什么老是同步不了
补一张图,被各位大大看不清。
你这个int是一个对象级的变量啊
你要访问同一个对象才能体现同步锁功能,现在是4个不同对象
num这个属性是Number这个类的属性,而你在main函数中实例化了四个Number类的对象实例,相当于四个线程分别对四个Number类中的num属性进行操作,当然不会同步。
不是说只要实现了runnable接口就可以实现对一个资源的共享吗
如果想要看是否同步,则需要有一个共享的实例,需要不同的的线程共享,而代码中实例化了多个类对象,也就相当于四个线程是相互独立的,分别对自己
线程内的实例进行操作,是不会同步的。