遇到一个笔试题:
请写出线程同步的方法!
网上搜索了半天没一个看懂得
我对线程的认识少之又少。谁能给一个简单点得线程同步代码 最好有些注释
谢谢
package synh;
/*class ThreadDemo implements Runnable{
int tickets = 100;//票数
String str = new String("");
public void run(){
while(true){
/*
*分析synchronized方法
*synchronized代码块中的语句只能有一个线程在执行
*
*任意一个对象都有一个标志位,有1和0两种状态
*当程序执行到synchronized代码块的时候线程会检查对象的标志位是1还是0
*如果是1则执行程序,同是将对象的标志位设置为0,其他线程执行到synchronized代码块时一看对象标志位为0
*则线程会阻塞,一直等到对象的标志位为1再执行下面的程序
*本程序中一共产生了4个线程,当一个线程执行synchronized代码块的时候其他三个线程会发生阻塞
*第一个线程执行完synchronized代码块后会把对象的标志位设置为1,其他的三个线程中的其中一个
*会抢到synchronized代码块的执行权,同时会把对象的标志位设置为0,就以这样的顺序循环执行
*
*我们也可以把对象标志位看成一个监视器,当一个线程执行到synchronized代码块的时候会检查监视器的
*状态,一个刚执行完synchronized代码块的线程也可以再次检查监视器并执行synchronized代码块
*
*多个线程要实现同步,必须使用相同的监视器对象(本例中4个线程都是用的str同一个对象),
*如果多个线程使用的不是同一个监视器对象则达不到同步的效果
*
synchronized(str){
if(tickets > 0){
try{Thread.sleep(1);}catch(Exception e){}
System.out.println(Thread.currentThread().getName() + " is salling ticket --- " + tickets--);
}
}
}
}
}*/
class ThreadDemo implements Runnable{
int tickets = 100;//票数
String str = new String("");
//在一个方法里实现同步
public void run(){
while(true){
sale();
}
}
/*
*同步方法和同步块道理一样,这里就不再说了
*当一个线程执行同步方法的时候其他的方法也不能再执行同步方法中的语句
*/
public synchronized void sale(){
if(tickets > 0){
try{Thread.sleep(1);}catch(Exception e){}//模拟不同步的实现
System.out.println(Thread.currentThread().getName() + " is salling ticket --- " + tickets--);
}
}
}
class ThreadTest{
public static void main(String [] args){
ThreadDemo td = new ThreadDemo();
/*
*生成4个线程
*
*/
new Thread(td).start();
new Thread(td).start();
new Thread(td).start();
new Thread(td).start();
}
}
看完了线程间的同步,再看看同步方法和同步代码块之间的同步
package synch;
class ThreadDemo implements Runnable{
int tickets = 100;//票数
String str = new String("");
//在一个方法里实现同步
public void run(){
if(str.equals("method")){
while(true){
sale();
}
}
else{
while(true){
synchronized(this){
if(tickets > 0){
try{Thread.sleep(1);}catch(Exception e){}
System.out.println(Thread.currentThread().getName() + " is salling ticket --- " + tickets--);
}
}
}
}
}
/*
*同步方法和同步块道理一样,这里就不再说了
*当一个线程执行同步方法的时候其他的方法也不能再执行同步方法中的语句
*/
public synchronized void sale(){
if(tickets > 0){
try{Thread.sleep(1);}catch(Exception e){}//模拟不同步的实现
System.out.println("method: " + Thread.currentThread().getName() + " is salling ticket --- " + tickets--);
}
}
}
class ThreadTest1{
public static void main(String [] args){
ThreadDemo td = new ThreadDemo();
/*
*生成4个线程
*
*/
new Thread(td).start();
//这里写这个sleep()是为了让CPU转到当前线程来执行
try{Thread.sleep(1);}catch(Exception e){} td.str = "method";
new Thread(td).start();
//new Thread(td).start();
//new Thread(td).start();
}
}
这里最关键的一点就是要想让同步方法和同步代码块同步,两者就要使用相同的监视器对象
本程序中用的同一个监视器对象是this
分享到:
相关推荐
java多线程同步互斥访问实例,对于初学者或是温故而知新的同道中人都是一个很好的学习资料
java线程同步实例,哲学家思考的代码实现,应该是一个比较好的例子
Java线程同步例子.pdf
java线程同步的例子.doc java线程同步的例子.doc
java线程同步的例子.pdf
电子书相关:包含4个有关JAVA线程的电子书(几乎涵盖全部有关线程的书籍) OReilly.Java.Threads.3rd.Edition.Sep.2004.eBook-DDU Java Thread Programming (Sams) java线程第二版中英文 java线程第二版中英文 ...
java线程同步的例子[文].pdf
一个java多线程的例子.doc 一个java多线程的例子.doc
java多线程知识点,源代码案例,代码案例中包括如何创建线程,主线程,线程优先级,线程组,线程同步,死锁,线程间的通信知识点
Java多线程同步具体实例.doc
一个详细讲解JAVA_线程同步与死锁的例子 希望可以帮助到你。
简单的同步例子 一个网络服务器类 AsyncInputStream类 使用TCPServer和AsynclnputStream 总结 第六章 Java线程调度 线程调度概述 何时调度是重要的 调度和线程优先级 常见的调度实现 本地调度支持 其他线程调度...
Java多线程同步具体实例讲解 .doc
本例将模仿经典的线程同步互斥例子——生产者和消费者问题,来演示 java 强大的多线程机制。生产者和消费者共享一个数据,当数据为0 时,消费者不可访问,生产者可访问数据,每次访问数据加1;当数据到达100 时,...
Java线程:概念与原理 Java线程:创建与启动 Java线程:线程状态的转换 Java线程:线程的同步与锁 一、同步问题提出 二、同步和锁定 三、静态方法同步 四、如果线程不能不能获得锁会怎么样 五、何时需要同步...
Java 多线程访问的经典例子,一个个代码 手动敲出,可以加深或理解 多线程访问 线程安全与同步的问题.
java一个多线程的经典例子.doc