今天测试了多线程并发计数的性能:结果测试性能为:
计数类型 | 运行时间 | 执行结果 | |
同步 | 478 | 10000000 | |
lock | 434 | 10000000 | |
AtomicInteger | 739 | 10000000 | |
none | 417 | 错误 |
测试结果显示原子操作性能还是比较的差;
import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.ReentrantLock; public class Counter { private AtomicInteger atomicI = new AtomicInteger(0); ReentrantLock lock = new ReentrantLock(); private int m = 0; private int k = 0; private int l = 0; public static void main(String[] args) { atomic(1); atomic(2); atomic(3); atomic(4); } public static void atomic(final int type){ final Counter cas = new Counter(); List<Thread> ts = new ArrayList<Thread>(600); long start = System.currentTimeMillis(); for (int j = 0; j < 10000; j++) { Thread t = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 1000; i++) { //cas.count(); if(type==1){ cas.safeCount(); }else if(type==2){ cas.count2(); }else if(type==3){ cas.count(); }else if(type==4){ cas.count1(); } //cas.count1(); } } }); ts.add(t); } for (Thread t : ts) { t.start(); } // 等待所有线程执行完成 for (Thread t : ts) { try { t.join(); } catch (InterruptedException e) { e.printStackTrace(); } } if(type==1){ System.out.println(type +"automic操作"+cas.atomicI.get()); }else if(type==2){ System.out.println(type +"lock:操作"+cas.m); }else if(type==3){ System.out.println(type +"synchronized:操作"+cas.k); }else if(type==4){ System.out.println(type +"none:操作"+cas.l); } System.out.println(System.currentTimeMillis() - start); } /** * 使用CAS实现线程安全计数器 */ private void safeCount() { atomicI.incrementAndGet(); } /** * 非线程安全计数器 存在竞争争条件,所以计算有错误 */ private void count1() { l++; } /** * 同步线程安全计数器 */ private synchronized void count() { k++; } /** * 锁线程安全计数器 */ private void count2() { //如果不加锁会计算出问题 lock.lock(); try{ m++; }catch(Exception e ){ }finally{ lock.unlock(); } } }
相关推荐
Atomic 的性能比 Synchronized 略逊,但是在激烈竞争的情况下,Atomic 的性能可以维持常态。Atomic 的缺点是只能同步一个值,一段代码中只能出现一个 Atomic 变量,多于一个同步无效。 四、性能比较 通过实验,...
lock是Java 5中引入的API,用于实现线程同步,主要是为了解决synchronized的性能问题。Lock接口提供了lock、unlock和tryLock等方法,用于控制线程的执行顺序。Lock接口的实现类有ReentrantLock、...
线程安全的实现通常依赖于同步机制,如`synchronized`和`ReentrantLock`,以及其他的并发工具,如`volatile`关键字、`Atomic`类等。理解这些机制的底层实现,例如锁膨胀、降级、自旋锁、轻量级锁和重量级锁等,对于...
为了避免并发编程中的各种问题,Java 提供了多种同步机制,包括synchronized、volatile、CAS、Lock 等。 1. synchronized synchronized 是 Java 的一条关键字,用于实现方法或代码块的同步。synchronized 可以修饰...
2. Lock与Synchronized:根据场景选择合适的锁机制,优化同步开销。 3. volatile关键字:理解其作用和限制,避免不必要的线程可见性问题。 4. Atomic类:使用无锁编程技术提升并发性能。 五、数据库优化 1. SQL...
因此,理解synchronized、Lock、Atomic类等并发工具的使用和性能影响是必要的。此外,避免空转等待、减少I/O操作、使用高效的数据结构和算法等也是代码优化的重要手段。 问题定位工具的使用是性能优化不可或缺的一...
- **锁优化**:理解锁的粒度,如使用synchronized,Lock,或使用原子变量类(Atomic*)来减少锁竞争,提高并发性能。 - **并发集合**:使用并发安全的数据结构,如ConcurrentHashMap,CopyOnWriteArrayList等,...
解决死锁的方法是,避免使用 synchronized 的嵌套使用,而是使用其他同步机制,例如 Lock 对象或 atomic 变量。同时,需要确保线程安全,避免线程之间的竞争关系。 总结来说,java-synchronized 嵌套使用代码详解是...
本测试主要关注`synchronized`关键字的使用,以及它如何影响线程同步和线程执行顺序。 `synchronized`关键字是Java中用于实现线程同步的关键机制,它确保同一时间只有一个线程可以执行特定的代码块或方法。当一个...
JUC 框架包含多个部分,包括 Lock 框架、Tools 类、Collections、Atomic、Executors 等。下面是每个部分的详细解释: 1.Lock 框架和 Tools 类: Lock 框架提供了一种更灵活的锁定机制,可以代替 synchronized 方法...
LockFreeList-master这个文件名可能表示这是一个开源项目,可能包含了LockFreeList的完整实现,包括测试和示例代码。对于学习和理解无锁编程以及Java并发,研究这个项目会是一个很好的实践。 总结来说,LockFree...
在Java中,线程同步可以通过多种方式实现,如synchronized关键字、java.util.concurrent.locks.Lock接口以及java.util.concurrent.atomic包中的原子操作类。 synchronized关键字是Java中的一种内置同步机制,它可以...
JUC(Java.util.concurrent)是 Java 语言中的并发工具包,提供了一些高效的线程安全的工具类,包括 Atomic 变量、Lock 锁、Semaphore 信号量、CountDownLatch 计数器、CyclicBarrier 栅栏、ThreadPool 线程池等。...
- **避免线程安全问题**:使用`synchronized`关键字或`Lock`实现线程同步,防止数据不一致。 - **理解并发容器**:例如`ConcurrentHashMap`比`synchronized HashMap`更适合多线程环境。 4. **CPU优化**: - **...
Java提供了多种线程同步机制,包括synchronized关键字、Lock接口和Atomic变量等。 知识点10: Java中的线程通信机制 Java中的线程通信机制是用于解决多线程之间的通信问题的。Java提供了多种线程通信机制,包括wait...
3. **Lock接口**:Java提供`java.util.concurrent.locks.Lock`接口,提供了比`synchronized`更细粒度的锁控制,如可重入锁、公平锁等。例如,`ReentrantLock`。 ```java import java.util.concurrent.locks.Lock; ...
在这个工程中,我们可能会看到各种锁的实例,如内置锁(synchronized)、显式锁(java.util.concurrent.locks包中的Lock接口)以及相关的同步工具类。 1. 内置锁(Synchronized): - **同步方法**:通过在方法...
- Lock 接口(如 ReentrantLock、ReadWriteLock):提供了比 synchronized 更灵活的锁管理。 - volatile 关键字:用于保证变量的可见性和禁止指令重排序,适用于读多写少的情况。 - Atomic 类(如 AtomicInteger、...