我需要知道的是 那里需要同步
如何实现同步 代码了解即可
以及实现同步之后 有哪些副作用
接下来以买火车票为例
package ThreadTest;
class Tong implements Runnable{
private int ticket=5;
public void run() {
for (int i = 0; i < 100; i++) {
if (ticket>0) {//还有票
try {
Thread.sleep(1000);//加入yanchi
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("卖票:ticket="+ticket--);
}
}
}
}
public class TongBuDemo {
public static void main(String[] args) {
Tong tong=new Tong();//定义线程对象
Thread t1=new Thread(tong);//定义Thread实例
Thread t2=new Thread(tong);
Thread t3=new Thread(tong);
t1.start();
t2.start();
t3.start();
}
}
出现了负数 说明那个地方出错了 相信大家 也看了 这个程序分为两个步骤
这时候就需要用同步代码块 同步就是指:多个操作在同一个时间段内只能有一个线程
其他线程只有等这个线程技术才能执行
代码块上加入synchronized关键字 就是同步代码块
package ThreadTest;
class Tong implements Runnable{
private int ticket=5;
public void run() {
for (int i = 0; i < 100; i++) {
synchronized (this) {//要对当前对象进行同步
if (ticket>0) {//还有票
try {
Thread.sleep(1000);//加入yanchi
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("卖票:ticket="+ticket--);
}
}
}
}
}
public class TongBuDemo {
public static void main(String[] args) {
Tong tong=new Tong();//定义线程对象
Thread t1=new Thread(tong);//定义Thread实例
Thread t2=new Thread(tong);
Thread t3=new Thread(tong);
t1.start();
t2.start();
t3.start();
}
}
这样大家都看的出效率降低了好多
还有一种方法 synchronized关键字将一个方法声明成同步方法
synchronized 方法返回值 方法名称(参数列表){}
package ThreadTest;
class Tong implements Runnable{
private int ticket=5;
public void run() {
for (int i = 0; i < 100; i++) {
//synchronized (this) {//要对当前对象进行同步
this.sale();
}
}
private synchronized void sale() {
if (ticket>0) {//还有票
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("卖票:ticket="+ticket--);
}
}
}
public class TongBuDemo {
public static void main(String[] args) {
Tong tong=new Tong();//定义线程对象
Thread t1=new Thread(tong);//定义Thread实例
Thread t2=new Thread(tong);
Thread t3=new Thread(tong);
t1.start();
t2.start();
t3.start();
}
}