文档章节

分别使用原子变量、synchronized关键字、ReentrantLock实现计数器

凯文加内特
 凯文加内特
发布于 2016/04/25 11:03
字数 292
阅读 104
收藏 6
package class10;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

//使用synchronized 实现计数器
public class SyncCounter {
	private int count = 0;

	public synchronized void increase() {
		count++;
	}

	public int getCount() {
		return count;
	}

	public static void main(String[] args) {
		final SyncCounter aor = new SyncCounter();
		// 线程池
		ExecutorService exec = Executors.newCachedThreadPool();
		// 模拟20个客户端访问
		for (int index = 0; index < 20; index++) {
			Runnable run = new Runnable() {
				public void run() {
					aor.increase();
					int result = aor.getCount();
					System.out.println(result);
				}
			};
			exec.execute(run);
		}
		// 退出线程池
		exec.shutdown();

	}
}

package class10;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;

//原子Integer 实现计数器
public class AtomicCounter {
	// 原子Integer递增对象
	public static AtomicInteger atomicInteger = new AtomicInteger(0);

	public static void main(String[] args) {
		// 线程池
		ExecutorService exec = Executors.newCachedThreadPool();
		// 模拟50个客户端访问
		for (int index = 0; index < 20; index++) {
			Runnable run = new Runnable() {
				public void run() {
					atomicInteger.getAndIncrement();
					System.out.println(atomicInteger);
				}
			};
			exec.execute(run);
		}
		// 退出线程池
		exec.shutdown();
		System.out.println(atomicInteger);
	}
}

package class10;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.ReentrantLock;

//使用ReentrantLock实现计数器
public class ReentrantLockTest {
	private ReentrantLock lock = new ReentrantLock();
	private int count;

	public void increase() {
		lock.lock();
		count++;
		try {
			try {
				Thread.sleep(10);
			} catch (InterruptedException e) {
				System.err.println(Thread.currentThread().getName() + " interrupted");
				Thread.currentThread().interrupt();
			}
		} finally {
			lock.unlock();
		}
	}

	public int getCount() {
		return count;
	}

	public static void main(String[] args) {
		final ReentrantLockTest reentrantLockTest = new ReentrantLockTest();
		// 线程池
		ExecutorService exec = Executors.newCachedThreadPool();
		// 模拟20个客户端访问
		for (int index = 0; index < 20; index++) {
			Runnable run = new Runnable() {
				public void run() {
					reentrantLockTest.increase();
					int result = reentrantLockTest.getCount();
					System.out.println(result);
				}
			};
			exec.execute(run);
		}
		// 退出线程池
		exec.shutdown();
		System.out.println(reentrantLockTest.getCount());
	}

}


© 著作权归作者所有

凯文加内特
粉丝 342
博文 703
码字总数 111087
作品 0
青岛
后端工程师
私信 提问
Java多线程三(线程安全的集合及java.util.concurrent包的锁)

一、线程安全的集合 JDK1.5之前,可以使用Venctor和Hashtable,也可以由java.util.Collections来创建线程安全的集合,如:Connections.synchronizedSet(Set<T>); Connections.synchronizedLi......

dkz
2013/03/24
11.4K
0
BATJ都爱问的多线程面试题总结 一点课堂(多岸学院)

1.1 说一说自己对于 synchronized 关键字的了解 synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执...

程伟鑫
09/11
23
0
java 面试知识点笔记(十二)多线程与并发-原理 中下篇

问:synchronized和ReentrantLock的区别? ReentrantLock(可重入锁) 位于java.util.concurrent.locks包(著名的juc包是由Doug lea大神写的AQS抽象类框架衍生出来的应用) 和CountDownLatc...

断风格男丶
05/21
17
0
Java并发(4)- synchronized与CAS

引言 上一篇文章中我们说过,volatile通过lock指令保证了可见性、有序性以及“部分”原子性。但在大部分并发问题中,都需要保证操作的原子性,volatile并不具有该功能,这时就需要通过其他手...

knock_小新
2018/08/01
0
0
Java虚拟机--(互斥同步与非阻塞同步)和锁优化

线程安全的实现方法: 互斥同步(悲观锁): 互斥同步是常见的一种并发正确性保障手段。同步是指在多个线程并发访问数据时,保证共享数据在同一时刻只被一个(或是一些,使用信号量的时候)线...

霍淇滨
2018/03/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【在 Nervos CKB 上做开发】Nervos CKB 脚本编程简介[3]:自定义代币

原文作者:Xuejie 原文链接:https://xuejie.space/2019_09_06_introduction_to_ckb_script_programming_udt/ Nervos CKB 脚本编程简介[3]:自定义代币 CKB 的 Cell 模型和 VM 支持许多新的用...

NervosCommunity
49分钟前
4
0
通过OAuth2.0 获取授权访问SF 用户数据

通过OAuth2.0 获取授权访问SF 用户数据 OAuth2.0 相关知识 深入了解 Salesforce 中的 OAuth 2.0(SF官方) OAuth 2.0 的一个简单解释(阮一峰大神) OAuth 2.0 的四种方式(阮一峰大神) GitHub OA...

在山的那边
54分钟前
7
0
编写程序:从键盘上接受一个三位数(首先要确保是三位数),计算出各位之和输出。

#include<stdio.h> int main() { int a,sum=0; printf("请输入一个三位数:\n"); scanf("%d",&a); sum=a/100+a%100/10+a%10; printf("这三个数的和:%d",sum); return 0; }......

201905021729吴建森
今天
7
0
如何离开/退出/停用Python virtualenv

我正在使用virtualenv和virtualenvwrapper。 我可以使用workon命令在virtualenv之间切换。 me@mymachine:~$ workon env1(env1)me@mymachine:~$ workon env2(env2)me@mymachine:~$ workon e......

技术盛宴
今天
7
0
成长之路 万事坚持难

任何事情开了头,想要更好的发展下去,不忘初心,就一定要坚持下去。 以前自己坚持了一些事情,比如早睡不吃东西,由于中途断了,没有及时止损,导致又接着恶习断了几天。所以 及时的反省和调...

T型人才追梦者
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部