public class Test {
public List<String> lists = Collections
.synchronizedList(new ArrayList<String>());
//使用不同的锁策略,导致数据出现混乱
public synchronized boolean listIfAbsent(String str) {
boolean ifAbsent = lists.contains(str);
if (!ifAbsent) {
lists.add(str);
}
return ifAbsent;
}
//使用同一个锁策略,保证数据的正确性
public boolean listIfAbsent1(String str) {
synchronized (lists) {
boolean ifAbsent = lists.contains(str);
if (!ifAbsent) {
lists.add(str);
}
return ifAbsent;
}
}
public static void main(String[] args) {
final Test t = new Test();
new Thread() {
public void run() {
//该线程正在对list最修改
if (!t.lists.contains("a")) {
t.lists.add("a");
}
if (!t.lists.contains("b")) {
t.lists.add("b");
}
// t.lists.set(0, "chenliang");
System.out.println(t.lists);
}
}.start();
t.listIfAbsent1("a");
// t.listIfAbsent("b");
}
}
从这代码中,我们会发现将线程安全委托给Collections的synronized也是不可行的。
因为他们使用的不同的锁策略,进一步的说就是listIfAbsent方法使用的Test这个对象锁。
而我们无法控制共有的 List<String> lists 不被其他的线程访问,并且进行修改。
所以在写代码的时候一定要考虑清楚,否则会出现很严重的问题。
分享到:
相关推荐
Java在线视频学习系统是一种以Java技术为基础开发的教育平台,旨在提供便捷的在线学习体验,同时结合了笔记功能和小组讨论功能,以增强用户的学习互动和效率。下面将详细阐述这个系统的各个关键知识点: 1. **Java...
多线程和IO流则涉及并发编程和数据读写,对于高性能的Web应用至关重要。 其次,Java-Web笔记进一步讲解了Servlet、JSP、过滤器、监听器等Java Web开发的核心技术。Servlet是Java Web应用的基础,用于接收和响应HTTP...
Java编程语言是世界上最流行的编程语言之一,尤其在企业级应用开发中占据主导地位。这份"18天Java笔记"提供了一个快速学习Java的核心内容精华,适合初学者和有一定经验的开发者进行回顾和巩固。txt版的格式使得笔记...
Java是世界上最流行的编程语言之一,尤其在企业级应用开发领域占据主导地位。"Core Java"是Java编程的基础,涵盖了Java语言的核心概念和技术。本篇笔记主要针对初学者,旨在帮助他们掌握Core Java的关键知识点。 一...
面向对象程序设计是计算机科学中的核心概念之一,Java语言作为其典型代表,广泛应用于软件开发。浙江大学翁恺老师的Java视频课程深入浅出地讲解了这一主题,这些笔记旨在帮助我们回顾和巩固Java开发的关键知识。 1....
11. 反射:反射是Java的一项强大功能,它允许程序在运行时动态地获取类的信息并操作类的对象,如创建对象、调用方法、访问字段等,常用于框架开发和元编程。 以上是Java核心技术的部分详解,学习Java不仅要理解这些...
Java编程语言是面向对象的、跨平台的编程语言,由Sun Microsystems(现为Oracle Corporation的一部分)于1995年发布。...通过深入学习和实践,你将能够驾驭这个强大且广泛应用的语言,开启你的Java编程之旅。
以上只是Java基础知识的一部分,深入学习还包括枚举、内部类、Lambda表达式、模块化系统(Jigsaw)、并发编程、JVM内存模型等多个方面。通过不断学习和实践,你可以成为一名熟练的Java开发者,实现“JAVA的梦想”。
Java是世界上最流行的编程语言之一,尤其在企业级应用开发领域占据主导地位。"java达内学习笔记"提供了针对初学者的教程资源,旨在帮助新手快速掌握Java编程的基础知识和技能。达内教育是一家知名的IT培训机构,其...
Java编程语言是信息技术领域中最广泛使用的编程语言之一,尤其在企业级应用开发中占据着核心地位。本笔记将深入探讨Java的关键概念和技术,帮助你掌握这个强大的编程工具。 1. **Java简介** Java是由Sun ...
12. **编程规范与最佳实践**:良好的编程习惯和遵循Java编程规范可以使代码更易读、易懂,减少出错的可能性。 通过张龙老师的Java SE课堂笔记,学习者不仅可以理解Java语言的基本语法,还能掌握面向对象设计原则和...
Java程序能够在运行时加载新的类和功能,使得程序能够灵活应对各种变化,如服务的升级和扩展。这种动态加载的能力为程序员提供了极大的便利,让他们能够更加迅速地响应新需求。 在安全性方面,Java的设计者们充分...
### JAVA学习笔记(全面) #### 一、Java技术基础 ##### 1.1 编程语言 ...以上内容只是Java学习笔记的一个概述,深入理解和掌握这些知识点需要不断地实践和探索。希望这份笔记能够为初学者提供一个良好的起点。
Java是世界上最流行的编程语言之一,尤其在企业级应用开发领域占据主导地位。JDK(Java Development Kit)是Java开发的核心工具集,包含了编译器、Java运行环境、调试器以及各种实用工具。JDK 6是Java的一个重要版本...
`编程之法++面试和算法心得.pdf`可能包含了一些算法和数据结构的问题,这是面试中的常见部分,能够展现你的逻辑思维和问题解决能力。理解基本的排序算法、搜索算法、图论和动态规划等概念是必要的。 综上所述,这个...
Java网络编程是开发分布式应用程序的关键技术之一,TCP(Transmission Control Protocol)作为一种面向连接的、可靠的传输协议,被广泛用于确保数据的准确无损传输。在这个例子中,我们将深入理解如何在Java中实现...