`
zhchx0827
  • 浏览: 194062 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

并发(三)

 
阅读更多

1:共享临界资源

非线程安全

public class EvenGenerator extends IntGenerator{
	private int currentEvenValue = 0;
	
	public int next() {
		currentEvenValue++;
		currentEvenValue++;
		return currentEvenValue;
	}
	
	public static void main(String[] args) {
		EvenChecker.test(new EvenGenerator(), 10);
	}
}

class EvenChecker implements Runnable {
	private IntGenerator generator;
	
	public EvenChecker(IntGenerator generator,int ident) {
		this.generator = generator;
	}

	public void run() {
		while(!generator.isCancled()) {
			int val = generator.next();
			if(val%2!=0){
				System.out.println(val + " not even!");
				generator.cancled();
			}
		}
	}
	
	public static void test(IntGenerator generator,int count) {
		ExecutorService exe = Executors.newCachedThreadPool();
		for(int i=0;i<count;i++) {
			//抢占临街资源:generator
			exe.execute(new EvenChecker(generator, count));
		}
		exe.shutdown();
	}
}


abstract class IntGenerator {
	private volatile boolean cancled = false;
	public abstract int next();
	
	public void cancled() {
		cancled = true;
	}
	
	public boolean isCancled() {
		return cancled;
	}
}

 

输出结果(具体输出几行不确定):

427 not even!
431 not even!
429 not even!

 

2:线程安全

1:基本上所有的并发模式在解决线程冲突问题的时候,都是采用序列化访问共享资源的方案(加锁后,一次只能有一个线程访问)。
2:所有对象自动含有单一的锁(也称为监视器)。在对象上调用任意synchronized方法时,对象都被加锁(其他的加锁方法也不能被其他线程访问,非线程安全的方法可以)
3:如果在类中有超过一个方法在处理临界资源,那么必须同步所有相关的方法

 

synchronized

使用synchronized进行加锁

public synchronized int next() {
		currentEvenValue++;
		currentEvenValue++;
		return currentEvenValue;
	}
//可以在类的范围内防止对static数据的并发访问
	public synchronized static void add() {
		
	}

 

 Lock

private Lock lock = new ReentrantLock();
	public int next() {
		lock.lock();
		try {
			currentEvenValue++;
			currentEvenValue++;
			lock.unlock();
			return currentEvenValue;
		} finally {
			lock.unlock();
		}
	}

 unlock()方法必须放置在finally语句中。return语句必须在try子句中出现,确保unlock()不会过早的发生,从而将数据暴露给第二个任务。

使用synchronized关键字时,需要的代码量少,出错的可能性小,解决特殊问题才用lock对象

synchronized不能尝试获取锁且最终失败,或者尝试一段时间后放弃

public class AttemptLocking {
	private ReentrantLock lock = new ReentrantLock();
	
	public static void main(String[] args) throws InterruptedException {
		final AttemptLocking al = new AttemptLocking();
		
		new Thread() {
			{
				setDaemon(true);
			}
			public void run(){
				al.lock.lock();
				System.out.println("acquired");
			}
		}.start();
//		Thread.yield();
		TimeUnit.SECONDS.sleep(1);
		al.untimed();
		al.timed();
	}
	
	public void untimed() {
		boolean captured = lock.tryLock();
		try {
			System.out.println("tryLock(): "+captured);
		}finally {
			if(captured) {
				lock.unlock();
			}
		}
	}
	
	public void timed() {
		boolean captured = false;
		try {
			captured = lock.tryLock(2, TimeUnit.SECONDS);
		}catch (Exception e) {
			throw new RuntimeException();
		} 
		
		try {
			System.out.println("tryLock(2,TimeUnit.seconds): " + captured);
		} finally {
			if(captured) {
				lock.unlock();
			}
		}
	}
}

 

public class Test {
	public static void main(String[] args) throws InterruptedException {
		Box w = new Box();
		w.put();
		
		w.remove();
	}
}

class Box {
	private int i=0;
	private ReentrantLock lock = new ReentrantLock();
	
	public void put() throws InterruptedException {
		boolean flag = lock.tryLock();
		System.out.println(flag);
		if(flag) {
			try {
				i++;
				System.out.println("increment:"+i);
				TimeUnit.SECONDS.sleep(15);
			} finally {
				lock.unlock();
			}
		}else {
			System.out.println("increment 锁不可用");
		}
	}
	
	public void remove() throws InterruptedException {
		boolean flag = lock.tryLock();
		System.out.println(flag);
		if(flag) {
			try {
				i--;
				System.out.println("decreat:"+i);
				TimeUnit.SECONDS.sleep(15);
			} finally {
				lock.unlock();
			}
		} else {
			System.out.println("decreat 锁不可用");
		}
	}
}

 

还是没看明白trylock的用法,为什么第一种可以正常的去尝试获取,获取不到锁时就继续执行,第二种还是会发生阻塞

分享到:
评论

相关推荐

    01-并发编程之深入理解JMM&并发三大特性(一).pdf

    在深入理解Java内存模型(JMM)及并发三大特性方面,我们需要先建立对多线程、共享内存模型、可见性、有序性和原子性的基础概念。Java内存模型是Java并发编程的核心,它定义了共享变量在多线程环境中的行为规则和...

    Java系统的高并发解决方法详解

    三、数据库集群和库表散列 大型网站都有复杂的应用,这些应用必须使用数据库,那么在面对大量访问的时候,数据库的瓶颈很快就能显现出来,这时一台数据库将很快无法满足应用,于是我们需要使用数据库集群或者库表...

    Java并发三大性质.docx

    Java并发编程中,多线程的三大性质是原子性、可见性和有序性。本文主要讨论的是其中的原子性。原子性是指一个操作是不可中断的,即在一个操作开始后,除非该操作完成,否则其他线程无法进行干扰。在Java中,不是所有...

    java并发程序设计

    8. 并发三大定律:指的是Amdahl定律、Gustafson定律和Sun-Ni定律,它们描述了在多处理器系统中,不同算法或硬件配置对性能的影响。 9. 神人和图书:此部分可能涉及到在并发领域有重大贡献的人物和推荐的书籍资料。 ...

    阿里Java并发程序

    10. **并发三大定律**: Amdahl定律、Gustafson定律和Sun-Ni定律是描述并行计算性能提升的理论基础,对理解并行系统的性能瓶颈和优化策略至关重要。 11. **学习资源**: 掌握并发编程还需要阅读经典图书和关注...

    Java多线程并发编程 并发三大要素

    Java多线程并发编程并发三大要素 Java多线程并发编程中,存在三个至关重要的要素:原子性、可见性和有序性。这三个要素是Java多线程并发编程的基础,是确保多线程程序的正确性和可靠性的关键。 一、原子性 原子性...

    Java并发程序设计教程.pdf

    ### 并发三大定律 Amdahl定律、Gustafson定律和Sun-Ni定律揭示了并行计算的理论极限和实际效率,它们对于理解和优化并发系统的性能具有指导意义。 ### 神人和图书 这部分可能指的是对Java并发领域有深刻贡献的...

    图灵Java高级互联网架构师第6期并发编程专题笔记.zip

    01-并发编程之深入理解JMM&并发三大特性(一)-fox 02-并发编程之深入理解JMM&并发三大特性(二)-fox 03-01-HashMap源码解析-monkey 03-并发List、Set、 ConcurrentHashMap底层原理剖析-monkey 04-Java并发线程池...

    java高并发处理方法

    ### Java高并发处理方法 #### 一、HTML静态化 HTML静态化是一种高效的网页加载方式,它可以显著提高网站性能并减少服务器负担。对于那些需要频繁更新的网站而言,完全依赖手动实现静态化并不现实,因此引入了内容...

    Java并发程序设计教程

    #### 九、并发三大定律:Amdahl、Gustafson、Sun-Ni 这三大定律描述了并行计算的理论限制和可能的性能提升。了解它们对于评估并发程序的实际效益至关重要。 #### 十、神人和图书、相关网络资源 参考高质量的书籍...

    并发编程之一 日常学习笔记

    首先,"并发编程之深入理解JMM&并发三大特性",这里的JMM指的是Java内存模型(Java Memory Model),它是Java平台中的核心概念,用于规定了线程之间如何共享和访问内存中的数据。并发的三大特性包括原子性、可见性和...

    阿里Java并发程序设计教程

    知识点九:并发三大定律。Amdahl定律、Gustafson定律和Sun-Ni定律是评估并行计算系统性能的三个理论基础,它们分别从不同的角度阐述了并行计算的效率和可伸缩性。Amdahl定律强调了程序中串行部分对整体性能的限制,...

    Java编程并发程序设计

    1、使用线程的经验:设置名称、响应中断、使用ThreadLocal 2、Executor :ExecutorService和Future ☆☆☆ ...9、并发三大定律:Amdahl、Gustafson、Sun-Ni 10、神人和图书 11、业界发展情况: GPGPU、OpenCL 12、复习题

    提高IIS的并发访问量,达到十万的并发

    步骤三:调整 machine.config 中的 processModel Machine.config 是 .NET Framework 的配置文件,用于设置 .NET 应用程序的行为。需要将 processModel 的 requestQueueLimit 设置到 100000。可以通过输入以下命令来...

    三份数据库并发处理方案

    6. **分布式数据库并发控制**:在分布式环境中,需考虑网络延迟和节点间的协调,如两阶段提交(2PC)、三阶段提交(3PC)等协议。 7. **数据库管理系统(DBMS)支持**:大多数现代DBMS,如MySQL、Oracle和SQL ...

    CsGo并发流程控制框架

    三、线程同步与互斥 在多线程环境中,线程同步是保证数据一致性的重要手段。C#提供了多种同步机制,如锁(Lock)、Monitor、Mutex、Semaphore等。例如,Mutex是一种全局资源锁,可以跨进程限制对共享资源的访问,...

Global site tag (gtag.js) - Google Analytics