关于多线程中synchronized的使用位置
2016-12-23 23:02
423 查看
在练习多线程之售票的时候,对于synchronized的使用有些困惑,因为我是用以下代码:
synchronized在此虽然将共享资源的代码块上锁,但是synchronized上锁之后,线程需要把synchronized里面的代码块执行完毕后才能释放锁,此代码块里面是一个循环,这就造成了最后的结果只有Thread-0线程在执行的情况。
之后对其进行修改:
public class ThreadDemo5 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
saleTicket_5 st = new saleTicket_5();
Thread t1 = new Thread(st);
Thread t2 = new Thread(st);
Thread t3 = new Thread(st);
Thread t4 = new Thread(st);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
class saleTicket_5 implements Runnable {
private int ticket = 1000;
Object obj = new Object();
public void run() {
while (true) {
synchronized (obj) {
if (ticket > 0) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+ "****" + ticket--);
} else
break;
}
}
}
}
需要注意的是synchronized里面需要包含全部的共享资源,以保证对共享资源操作的原子性,另外 不要忘记退出while循环
public class ThreadDemo5 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub saleTicket_5 st = new saleTicket_5(); Thread t1 = new Thread(st); Thread t2 = new Thread(st); Thread t3 = new Thread(st); Thread t4 = new Thread(st); t1.start(); t2.start(); t3.start(); t4.start(); } } class saleTicket_5 implements Runnable { private int ticket = 1000; Object obj = new Object(); public void run() { synchronized (obj) { while (ticket > 0) { try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "****" + ticket--); } } } }
synchronized在此虽然将共享资源的代码块上锁,但是synchronized上锁之后,线程需要把synchronized里面的代码块执行完毕后才能释放锁,此代码块里面是一个循环,这就造成了最后的结果只有Thread-0线程在执行的情况。
之后对其进行修改:
public class ThreadDemo5 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
saleTicket_5 st = new saleTicket_5();
Thread t1 = new Thread(st);
Thread t2 = new Thread(st);
Thread t3 = new Thread(st);
Thread t4 = new Thread(st);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
class saleTicket_5 implements Runnable {
private int ticket = 1000;
Object obj = new Object();
public void run() {
while (true) {
synchronized (obj) {
if (ticket > 0) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+ "****" + ticket--);
} else
break;
}
}
}
}
需要注意的是synchronized里面需要包含全部的共享资源,以保证对共享资源操作的原子性,另外 不要忘记退出while循环
相关文章推荐
- Java关于Synchronized关键字在不同位置使用的理解
- Java关于Synchronized关键字在不同位置使用的理解
- 关于使用多线程创建查询等待对话框
- java中解决多线程关联锁 synchronized 关键字的使用
- 关于C#多线程、网络编程与计时器Timer的一点使用心得
- 关于多线程同步的初步教程--使用synchronized [推荐]
- Java【多线程知识总结(7)】多线程同步问题-关于synchronized代码块和synchronized方法的应用
- 关于使用多线程的一些日志
- 初学Java多线程:使用Synchronized关键字同步类方法
- android-多线程设计wait、notify、notifyall、synchronized的使用机制 - 随心
- 关于多线程同步的初步教程--使用synchronized
- 关于多线程使用的问题
- 关于多线程(二)---synchronized关键字与volatile域
- Java中级----多线程同步基本思想,java多线程设计wait、notify、notifyall、synchronized的使用机制(转)
- 关于JAVA多线程并发synchronized的测试与合理使用
- 关于多线程中使用SendMessage
- 关于java当中的多线程设计, wait/notify机制 , synchronized与对象锁
- 关于 synchronized 的使用
- 关于VB使用ActiveX.Exe创建多线程程序的奇怪问题
- iphone多线程简介————关于NSOperation的使用(转自henry-sea的博客)