黑马程序员技术交流社区

标题: synchronized同步关键字 [打印本页]

作者: 曾炜良    时间: 2018-4-22 23:01
标题: synchronized同步关键字
/*
第一种案例
*/
public classSellTicketDemo {
publicstatic void main(String[] args) {
// 创建资源对象
SellTicketst = new SellTicket();
// 创建三个线程对象
Thread t1 = new Thread(st, "窗口1");
Thread t2 = new Thread(st, "窗口2");
Thread t3 = new Thread(st, "窗口3");
// 启动线程
t1.start();
t2.start();
t3.start();
}
}
public classSellTicket implements Runnable {
// 定义100张票
privateint tickets = 100;
// 定义同一把锁
privateDemo d = new Demo();
private int x=0;
//同步代码块用任意对象做锁
@Override
publicvoid run() {
while(true) {
if(x%2==0){
synchronized (this){
if(tickets > 0) {
try{
Thread.sleep(100);
}catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"正在出售第" + (tickets--) + "张票");
}
}
}else{
sellTicket();//如果这样都是没什么问题
}
x++;
}
}
//如果一个方法一进去就看到了代码被同步了,那么我就在想能不能把这个同步加在方法上呢?
private synchronized  void sellTicket(){
if(tickets > 0) {
try{
Thread.sleep(100);
}catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"正在出售第" + (tickets--) + "张票");
}
}

}
/*
第2种方式
*/
public classSellTicketDemo {
publicstatic void main(String[] args) {
// 创建资源对象
SellTicketst = new SellTicket();
// 创建三个线程对象
Thread t1 = new Thread(st, "窗口1");
Thread t2 = new Thread(st, "窗口2");
Thread t3 = new Thread(st, "窗口3");
// 启动线程
t1.start();
t2.start();
t3.start();
}
}
public classSellTicket implements Runnable {
// 定义100张票
privatestatic int tickets = 100;
// 定义同一把锁
privateDemo d = new Demo();
private int x=0;
//同步代码块用任意对象做锁
@Override
publicvoid run() {
while(true) {
if(x%2==0){
synchronized (SellTicket .class) {
if(tickets > 0) {
try{
Thread.sleep(100);
}catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"正在出售第" + (tickets--) + "张票");
}
}
}else{
sellTicket();//如果这样都是没什么问题
}
x++;
}
}
//如果一个方法一进去就看到了代码被同步了,那么我就在想能不能把这个同步加在方法上呢?
private static synchronized  void sellTicket(){
if(tickets > 0) {
try{
Thread.sleep(100);
}catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"正在出售第" + (tickets--) + "张票");
}
}

}
synchronized有2种方式:一种是同步代码块,另一种是同步方法.而最重要的是sybchronized的锁是什么对象?一般都是所在的类
同步代码块和同步方法不是互不干涉的.
1.synchronized(this)对应的是类中的public synchronized void xxxx().
2.synchronized(类.class)对应的是类中的public static synchronized void xxxx().
如果有这2种对应的话,就会互相干扰


作者: gzgd    时间: 2018-10-9 10:29
不错不错
作者: gzgd    时间: 2018-10-9 10:29

作者: gzgd    时间: 2018-10-9 10:29

作者: gzgd    时间: 2018-10-9 10:29

作者: gzgd    时间: 2018-10-9 10:29

作者: gzgd    时间: 2018-10-9 10:29

作者: gzgd    时间: 2018-10-9 10:29

作者: gzgd    时间: 2018-10-9 10:29

作者: gzgd    时间: 2018-10-9 10:29

作者: gzgd    时间: 2018-10-9 10:30

作者: gzgd    时间: 2018-10-9 10:30

作者: gzgd    时间: 2018-10-9 10:30

作者: gzgd    时间: 2018-10-9 10:30

作者: 白猫    时间: 2018-10-9 10:30
加油,同学
作者: Haraella    时间: 2018-10-9 10:30
可以可以
作者: Haraella    时间: 2018-10-9 10:30

作者: Haraella    时间: 2018-10-9 10:30

作者: Haraella    时间: 2018-10-9 10:31

作者: Haraella    时间: 2018-10-9 10:31

作者: Haraella    时间: 2018-10-9 10:31

作者: Haraella    时间: 2018-10-9 10:31

作者: Haraella    时间: 2018-10-9 10:31

作者: Haraella    时间: 2018-10-9 10:31

作者: Haraella    时间: 2018-10-9 10:31

作者: Haraella    时间: 2018-10-9 10:31

作者: Haraella    时间: 2018-10-9 10:31

作者: Haraella    时间: 2018-10-9 10:31

作者: Haraella    时间: 2018-10-9 10:31

作者: zzzz2017    时间: 2018-10-9 10:32
加油,同学




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2