小白多线程问题求问

杀入油漆区orz 2016-07-04 04:53:46
我现在有这么一个需求:
同一个实例的两个方法(A和B)。现在要求:在多线程环境下,1:A和B两个方法是互斥的;2:A方法可以同时被执行多次。


对于1,想到给A B加synchronized关键字,可以使得多线程下A和B的访问互斥,但是A也变成了同一时间只能有一个线程实现对它的调用。。。小白求问有什么好的解决方法么??
...全文
181 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
杀入油漆区orz 2016-07-05
  • 打赏
  • 举报
回复
那如果我想A B方法都可以被多个线程同时调用,但是A B还是要互斥呢?
rickylin86 2016-07-04
  • 打赏
  • 举报
回复

import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;


public class Test{
	public static void main(String[] args){
		Job job = new Job();
		Thread[] readThreads = new Thread[10];
		Thread writeThread = new Thread(new WriteTask(job),"Write");
		for(int i = 0 ; i < readThreads.length ; i++){
			readThreads[i] = new Thread(new ReadTask(job),"Read" + (i + 1));
		}

		writeThread.start();
		for(int i = 0 ; i < readThreads.length ; i++){
			readThreads[i].start();
		}
	}
}

class ReadTask implements Runnable{
	
	public ReadTask(Job job){
		this.job = job;
	}

	@Override
	public void run(){
		while(true){
			job.readJob();
		}
	}

	private Job job;
}

class WriteTask implements Runnable{
	
	public WriteTask(Job job){
		this.job = job;
	}

	@Override
	public void run(){
		while(true){
			job.writeJob();
		}
	}

	private Job job;
}

class Job{

	//对于ReadLock,同一时间可以允许有多个线程访问.
	//对于WriteLock,同一时间只允许一个线程访问.
	//并且ReadLock与WriteLock线程是互斥的.
	
	public void readJob(){
		try{
			readLock.lock();
			System.out.printf("%s:This is readJob() start.\n",Thread.currentThread().getName());
			Thread.sleep(1000);
			System.out.printf("%s:This is readJob() end.\n",Thread.currentThread().getName());
		}catch(InterruptedException e){
			e.printStackTrace();
			System.exit(1);
		}finally{
			readLock.unlock();
		}
	}

	public void writeJob(){
		try{
			writeLock.lock();
			System.out.printf("%s:This is writeJob() start.\n",Thread.currentThread().getName());
			Thread.sleep(1000);
			System.out.printf("%s:This is readJob() end.\n",Thread.currentThread().getName());
		}catch(InterruptedException e){
			e.printStackTrace();
			System.exit(1);
		}finally{
			writeLock.unlock();
		}
	}
	private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
	private final ReadLock readLock = lock.readLock();
	private final WriteLock writeLock = lock.writeLock();
}


dgqjava 2016-07-04
  • 打赏
  • 举报
回复
最方便的做法是用读写锁 ReentrantReadWriteLock, 百度查下这个类的用法, 当然也能自己实现
杀入油漆区orz 2016-07-04
  • 打赏
  • 举报
回复
有大神吗?啊啊啊啊啊啊

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧