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();
}
}
}
- JAVASE总结--线程同步
- JavaSE 线程同步之synchronized
- JAVASE总结--线程
- JAVASE总结--线程的死锁
- JAVASE总结--线程定时器Timer
- javaSE基础编程——线程同步
- JavaSE:Java多线程并发和线程同步
- 线程同步的总结
- java 线程同步总结
- Windows线程同步总结
- C# 线程同步总结
- 线程同步的总结
- 线程同步归纳总结
- 线程同步总结
- windows线程同步总结
- 线程同步工具包总结
- Java 线程同步总结
- Java 线程同步总结
- Java main 函数中的 String[] args是什么?
- 51Nod-1191-消灭兔子
- Zephyr新手指南
- 判断一个url字符串的字节长度是否过长
- JAVASE总结--线程的死锁
- JAVASE总结--线程同步
- C++中const用法总结
- JAVASE总结--线程定时器Timer
- LeetCode387—First Unique Character in a String
- 防表单重复提交
- vs2012(vc11)类反射试验
- Java编程思想第四版读书笔记——第十六章 数组
- Java8新特性
- JAVSE总结--网络编程