public class TicketDemo {
public static void main(String[] args) {
Ticket t = new Ticket();
Thread t1 = new Thread(t);//创建了一个线程;运行Ticket t里面的run方法
Thread t2 = new Thread(t);//创建了一个线程;
Thread t3 = new Thread(t);//创建了一个线程;
Thread t4 = new Thread(t);//创建了一个线程;
Thread t5 = new Thread(t);//创建了一个线程;
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
//如用下面方法1 extends Thread,四个窗口各卖100张票共400张票,比总票数100张多,不合理;故用上面方法2 implements Runnable
/*
Ticket t1 = new Ticket();
//Ticket t2 = new Ticket();
//Ticket t3 = new Ticket();
//Ticket t4 = new Ticket();
t1.start();
t2.start();
t3.start();
t4.start();
*/
}
}

格式: 在函数上加上synchronized修饰符即可。
同步函数用的是哪一个锁:
1. 函数需要被对象调用。那么函数都有一个所属对象引用,就是this,所以同步函数使用的锁是this。
2. 静态的同步方法,使用的锁是该方法所在类的字节码文件对象:
类名.class
因为静态方法中不可以定义this。静态进内存时,内存中没有本类对象,但是一定有该类对应的字节码文件对象:类名.class
如何找线程安全问题:
1,明确哪些代码是多线程运行代码。
2,明确共享数据。
3,明确多线程运行代码中哪些语句是操作共享数据的。
有两个储户分别存300元,每次存100,存3次。
目的:该程序是否有安全问题,如果有,如何解决?
public class Bank {
private int sum;
public synchronized void add(int n) {
sum = sum + n;
try {
Thread.sleep(10);
} catch (Exception e) {
}
System.out.println("sum=" + sum);
}
}public class Cus implements Runnable {
private Bank b = new Bank();
public void run() {
for (int x = 0; x < 3; x++) {
b.add(100);
}
}
}
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-55883-3.html
1%