package collection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* 测试快速失败模型,不加锁的情况下,在foreach遍历list的时候删除list中的元素
*
*/
public class ListTest {
private static List<String> list = Collections.synchronizedList(new ArrayList<String>());
static{
//初始化List
for (int i = 0; i < 100; i++) {
list.add(String.valueOf(i));
}
}
public static void main(String[] args) {
/*
* 快速失败一:foreach中删除元素
*/
// for (String string : list) {
// System.out.println(string);
// if(string.equals("50")){
// list.remove(string);
// }
// }
//解决办法
new Thread(new Runnable(){
@Override
public void run() {
synchronized (list) {
for (String string : list) {
System.out.println(string);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}).start();
new Thread(new Runnable(){
@Override
public void run() {
try {
Thread.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (list) {
list.remove("50");
}
}
}).start();
}
}
synchronizedList
public static <T> List<T> synchronizedList(List<T> list)返回指定列表支持的同步(线程安全的)列表。为了保证按顺序访问,必须通过返回的列表完成所有对底层实现列表的访问。
在返回的列表上进行迭代时,用户必须手工在返回的列表上进行同步:
List list = Collections.synchronizedList(new ArrayList());
...
synchronized(list) {
Iterator i = list.iterator(); // Must be in synchronized block
while (i.hasNext())
foo(i.next());
}
不遵从此建议将导致无法确定的行为。
如果指定列表是可序列化的,则返回的列表也将是可序列化的。
参数:
list - 被“包装”在同步列表中的列表。
返回:
指定列表的同步视图。
分享到:
相关推荐
问题的根源在于,foreach 标签在生成 SQL 语句时,会将集合对象的每个元素用逗号分隔,并且在每个元素之间添加空格、换行、回车符号。这些符号会导致 SQL 语句执行失败或返回错误的结果。 解决方案是使用 replace ...
2. 删除元素:remove() 方法移除指定元素,clear() 方法清空整个集合。 3. 访问元素:get() 方法根据键获取值,contains() 检查是否包含特定元素。 4. 遍历:迭代器(Iterator)是遍历集合的主要方式,也可使用...
- **Iterator/foreach**:适用于所有集合类型,支持在遍历过程中删除元素。 - **最佳实践**:根据具体需求选择合适的方法,对于频繁的增删操作推荐使用`Iterator`。 #### 十六、ArrayList详解 - **优点**:查询速度...
4. **方法**:包括添加元素(Add),插入元素(Insert),删除元素(Remove),查找元素(Find),以及对列表进行排序(Sort)等操作。 5. **枚举器**:实现IEnumerator接口,以便可以使用foreach循环遍历列表中的所有元素。 ...
- **解释**:在数据库操作中,RECALL命令用于恢复被删除的记录,但不会改变当前的记录指针位置,因此正确答案是RECALL。而LIST命令会列出所有记录,SUM命令用于计算数值字段的总和,REPLACEALL命令则会替换满足条件...
- `error`:请求失败时执行的回调函数,参数`jqXHR`, `textStatus`, `errorThrown`分别表示错误的XMLHttpRequest对象、状态和错误信息。 ### 7. JSON2.js 在旧版浏览器中,不支持原生的JSON解析和序列化。`json2....
- **添加/删除类**:使用`.classList.add()`、`.classList.remove()`等方法控制元素的CSS类,从而改变元素的样式。 - **事件监听**:通过`addEventListener()`和`removeEventListener()`方法为元素绑定和移除事件...
测试用例应该覆盖各种操作,包括正常遍历、中间删除元素、遍历空集合、修改集合时遍历等。 7. **断言**:在测试中,使用断言(如JUnit的`assertEquals()`、`assertNull()`等)来验证迭代器行为是否符合预期。例如,...
另外,AJAX请求可能会因为各种原因失败(如网络问题),所以前端代码中需要有异常处理逻辑,以确保用户在遇到错误时能够得到明确的反馈。 #### 10. AJAX的优势与应用场景 AJAX最大的优势在于提供一种更为流畅的用户...
**Ajax CRUD操作详解** 在现代Web开发中,Ajax(Asynchronous JavaScript and XML)技术被广泛应用于实现页面的无刷新更新,极大...这种方式提高了Web应用的交互性和效率,使得用户在等待数据处理时能有更流畅的体验。
在Redis中,可以使用`LRANGE`命令获取List中的部分元素,实现分页。在`list.php`中,我们计算总页数,根据当前页码获取相应的用户ID,然后使用`HGETALL`获取对应用户的所有信息。 ```php // list.php简化版 $page_...
- **错误发生**:当命令执行失败时会产生错误。 - **错误信息**:使用`error`命令获取错误详细信息。 ##### 从TCL脚本中产生错误 - **主动抛出错误**:使用`error`命令主动抛出错误。 ##### 使用catch捕获错误 - *...
在C#编程中,`Dictionary, TValue>`是.NET框架提供的一个非常重要的数据结构,它实现了键值对的存储,提供了快速访问、插入和删除操作。然而,有时我们需要根据特定需求自定义`Dictionary`类来扩展其功能或优化性能...
在Java编程中,`ConcurrentModificationException`是一个常见的运行时异常,主要出现在多线程环境下对集合类(如List、Set、Map等)进行并发修改时。然而,这个异常不仅限于多线程环境,即使在单线程中,如果在遍历...
2. **DOM操作**:Document Object Model (DOM) 是HTML和XML文档的结构化表示,JavaScript通过DOM API可以操作页面元素,如添加、删除、修改元素,或者获取元素的属性和内容。 3. **AJAX**:Asynchronous JavaScript...
- 使用迭代器(Iterator)遍历集合,更灵活且支持在遍历过程中删除元素。 #### 五、多线程与并发 - **线程的创建和生命周期**: - 创建线程可以通过继承`Thread`类或实现`Runnable`接口来实现。 - 线程的生命...
- **列表(List)**:类似于动态数组,支持快速插入和删除元素。 - **队列(Queue)**:遵循先进先出(FIFO)原则的数据结构。 - **栈(Stack)**:遵循后进先出(LIFO)原则的数据结构。 - **字典(Dictionary, ...
- **原理:** 通过部署多个缓存实例,形成集群,当其中一个节点失败时,其他节点可以继续提供服务。 - **工具/技术:** Redis Cluster、Memcached 集群等。 2. **方案二:使用冗余备份:** - **原理:** 对主...
- 测试结果会在JUnit视图中显示出来,包括成功、失败的测试以及测试耗时等信息。 #### 三、Java 5的新特性 ##### 静态导入 Java 5引入了静态导入,使得可以直接使用类中的静态成员而无需指定类名。 - **语法**:...
- `-`前缀:`-rm file`表示如果删除失败,不要停止执行。 4. 函数与高级特性 - `$(patsubst pattern,replacement,text)`:替换文本中符合模式的子串。 - `$(filter pattern,...)`:筛选出列表中符合模式的元素。...