class Demo implements Runnable {
//创建同步所需对象
Object obj = new Object();
int num = 100;
public void run(){
while(true){
//创建同步解决线程的安全问题,同步加在使用共享数据的代码快上
synchronized(obj){
if(num>0){
try{Thread.sleep(6);}catch(InterruptedException e){
}
System.out.println(Thread.currentThread().getName()+"---"+num);
num--;
}
}
}
}
}
public class XianCheng {
public static void main(String[] args) {
Demo d=new Demo();
Thread th=new Thread(d);
Thread th1=new Thread(d);
Thread th2=new Thread(d);
th.start();
th1.start();
th2.start();
}
}
两个线程,在两个不同的方法上进行
class Demo implements Runnable {
int num = 100;
boolean flag = true;
public void run() {
if (flag == true) {
while (true) {
synchronized (this) {
if (num > 0) {
System.out.println(Thread.currentThread().getName() + "---" + num);
num--;
}
}
}
} else {
show();
}
}
//当方法里的代码都需要加同步,就可以 在方法上加同步,非静态方法加同步,同步锁使用的是当前对象
//当在静态方法上加同步时,同步锁是类名加class
private synchronized void show() {
// TODO Auto-generated method stub
if (num > 0) {
System.out.println(Thread.currentThread().getName() + "---" + num);
num--;
}
}
}
public class XianCheng {
public static void main(String[] args) {
Demo d = new Demo();
Thread th1 = new Thread(d);
Thread th2 = new Thread(d);
th1.start();
//由于cpu先是在主线程上运行的,当开启第一个线程时cpu不一定立刻执行
//这时加一个“睡眠”,保证cpu进入第一个线程
try{Thread.sleep(6);}catch(InterruptedException e){
}
th2.start();
}
}