一、多线程内存:代码实质上放在栈中运行,多线程实质是新开栈内存,然后多个栈互相抢cpu资源 时间片已到再抢cpu资源。
二、多线程中要加锁:1 同步方法 2同步块
多线程互斥共享“基本数据类型数据资源”--->基本数据类型的变量不能当做锁,因为互斥锁是对象锁,锁的是对象。所以我们的解决方法为:1 如果这个对象是静态的,那么我们新建一个与共享的“基本数据类型”资源平级的static对象来代替对象锁。2如果是类的非静态成员,可以直接用this来代替。 我们要锁同一个对象,在同一个类中用静态变量,在非同一个类中我们用传参来实现。
三、在方法上加锁,锁的对象是方法的拥有者。
面试题:
火车卖票 1-200张票 4个窗口卖 要求输出每个窗口卖出哪张票
版本一:
SaleTicket类:
package cn.hncu.thread.ticket.v1;
/**
* 200张火车票分四个窗口卖出去,输出卖的票
*
* @author <a href="mailto:wyj950411@foxmail.com">军街</a>
*
* @version 1.0 2016-4-21
*/
public class SaleTicket {
public static void main(String[] args) {
TicketWindow tw1 = new TicketWindow("窗口1");
Thread t1 = new Thread(tw1);
TicketWindow tw2 = new TicketWindow("窗口2");
Thread t2 = new Thread(tw2);
TicketWindow tw3 = new TicketWindow("窗口3");
Thread t3 = new Thread(tw3);
TicketWindow tw4 = new TicketWindow("窗口4");
Thread t4= new Thread(tw4);
// Thread t1=new TicketWindow("窗口1");
// Thread t2=new TicketWindow("窗口2");
// Thread t3=new TicketWindow("窗口3");
// Thread t4=new TicketWindow("窗口4");
t1.start();
t2.start();
t3.start();
t4.start();
}
}
TicketWindow类:
package cn.hncu.thread.ticket.v1;
public class TicketWindow implements Runnable{
private String name;
private static int num=20000;
private static Object obj = new Object();
public TicketWindow(String name) {
this.name = name;
}
@Override
public void run() {
while (true) {
synchronized (obj) {
if (num > 0) {
System.out.println(name + ":" + num--);
}else{
break;
}
}
}
}
}
版本二:
SaleTicket 类
package cn.hncu.thread.ticket.v2;
public class SaleTicket {
public static void main(String[] args) {
TicketWindow tw1=new TicketWindow();
Thread t1=new Thread(tw1);
t1.start();
Thread t2=new Thread(tw1);
t2.start();
Thread t3= new Thread(tw1);
t3.start();
Thread t4=new Thread(tw1);
t4.start();
}
}
TicketWindow类:
package cn.hncu.thread.ticket.v2;
public class TicketWindow implements Runnable{
private int num=200;
@Override
public void run() {
synchronized (this) {
while (true) {
if (num > 0) {
System.out.println(num);
num--;
} else {
break;
}
}
}
}
}