JAVASE总结--线程同步

来源:互联网 发布:超级英雄数据下载失败 编辑:程序博客网 时间:2024/05/12 00:41

有时,多种线程需要共享同一个对象,会产生该数据的访问冲突,破坏数据的一致性。

线程同步(相互排斥):

在某个时刻只允许一个线程独占访问该共享对象,而其他成员只能处于阻塞状态。只有当该线程访问操作结束后,才允许其他线程访问。

关键字:synchronized ['sɪŋkrənaɪzd]

两种方式:

方法

如果是静态方法,隶属于类,如果这个时候加syncoronized锁定的是一个类,类在内存中只有一个,所以这个时候可以锁上.

如果是非静态方法,隶属于对象,所以这个时候加syncoronized锁定的是一个对象,当调用的为多个对象时,锁不上

代码块

多线程共享同一个对象,是就锁类因为类在内存中只有一个所以可以锁住。

只有一个对象可以锁this。

代码:

public class HelloStation {

public static void main(String[]args) {

Conductor c1 =new Conductor("柳岩");

Conductor c2 =new Conductor("唐嫣");

Conductor c3 =new Conductor("马蓉");

c1.start();

c2.start();

c3.start();

}

}

 

class Conductorextends Thread {

//火车票总数

private static int ticketNum = 100;//不会

private String str1 =new String("abcdefg");//不会

private String str2 = "abcdefg";//可以锁上,因为String常量有常量池,三个对象的str2指向同一个abcdefg。

private Date date =new Date();//不会

private int a = 127;//不会

public Conductor(String cname) {

super(cname);

}

@Override

public void run() {

//开始卖火车票,一共100

while (ticketNum > 0) {

//c1 c2 c3都进入

//限制一个进synchronized ((Integer) a) {(Conductor.class/str2

Integer类有一个缓存,它会缓存-128~127之间的整数。不能超出范围。

//当ticketNum变为0时,synchronized失效,此处仍有俩对象等待,只有再加一次判断才可以保证票不会变为-1if (ticketNum > 0) {

this.sell();

}

}

}

}

public void sell() {//或者 public static synchronized void sell()

try {

Thread.sleep(10);

ticketNum--;

System.out.println("售票员【" +Thread.currentThread().getName() +"】卖出一张火车票,余票" +ticketNum +"");

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

 

 

0 0
原创粉丝点击