很多时候在使用synchronized时,很多的文章都会讲对静态类,对象加同步,但这样会很影响程序的执行效率,并发数也会因此减少,所以要想办法减小synchronized影响的代码量,缩小同步的范围,下面的对字符串常量池加锁是我比较常用的方式。(理解需求,对需要同步的进行同步)
package thread;
class Runner implements Runnable {
private String name;
private String[] bar;
public Runner(String name,String[] bar) {
super();
this.name = name;
this.bar = bar;
}
@Override
public void run() {
try {
//需要取的次数
for(String b:bar) {
//对bar加锁
synchronized(b) {
// //synchronized((b+"").intern()) {
System.out.println(name+ " : Go!!: " + b.hashCode());
Thread.sleep(3000);
System.out.println(name+ " : 完成: " + b.hashCode());
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class Race {
public static void main(String[] args) {
String[] str1={"1","2"};
String[] str2={"1","2"};
String[] str3={"2","1"};
// String str1=String.valueOf((new Random()).nextInt(2));
//一共多少Runner
new Thread(new Runner("1",str1)).start();
new Thread(new Runner("2",str2)).start();
new Thread(new Runner("3",str3)).start();
}
}
如果字符串没有在常量池中需要用intern方法,将其放入常量池中。
当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。
分享到:
相关推荐
`synchronized`关键字作用于一个对象(在这个例子中是字符串`str`),它创建了一个监视器或者称为锁。当一个线程进入同步代码块并执行其中的语句时,该线程会获取到`str`对象的锁,其他尝试进入同步代码块的线程会被...
在这个例子中,队列可能被配置为存储特定长度的字符串。`xQueueCreate()`函数用于创建一个消息队列。 2. **字符串数据结构**:在Arduino平台上,字符串通常是`String`类的对象,它们可以动态地增长和收缩。在...
在Go语言中,将字符串写入文件是常见的文件操作任务之一。这有助于数据持久化、日志记录或者创建配置文件等。以下将详细介绍如何在Go语言中实现这一功能,并提供相关的编程技巧和注意事项。 首先,我们需要引入两个...
varchar2 1~4000字节 可变长度字符串,与CHAR类型相比,使用VARCHAR2可以节省磁盘空间,但查询效率没有char类型高 数值类型 Number(m,n) m(1~38) n(-84~127) 可以存储正数、负数、零、定点数和精度为38位的浮点数...
例子可能涵盖线程创建、同步(互斥锁、信号量等)和通信。 13. **图形编程**:通过特定库(如SDL、OpenGL),可以在C语言中进行图形界面和游戏开发。例子可能涉及窗口创建、颜色填充、图像加载、事件处理等。 14. ...
进程A(PID为1的进程)向共享内存写入字符串,而进程B则读取并打印该字符串。最后,两个进程都使用`shmdt()`断开与共享内存的连接。 请注意,为了防止资源泄露,通常需要在不再使用共享内存时,使用`shmctl()`函数...
10. **并发编程**:如果例子涉及到多线程或多进程,你可以学习到如何使用pthread库创建和管理线程,以及同步机制(互斥锁、信号量等)。 这些代码实例将有助于你将理论知识转化为实践能力,逐步提升为高级C语言...
这个例子展示了如何使用线程信号量来同步两个线程的执行,确保在任何时候只有一个线程在处理字符串数组。当输入结束标志"end"时,主线程等待子线程完成并销毁信号量,程序结束。 参考文献《基于项目驱动的嵌入式 ...
12. **正则表达式**:Regex类的使用,进行字符串的匹配、替换和提取。 13. **反射**:通过Reflection API动态加载和操作类型,理解Type、MethodInfo、PropertyInfo等类的用途。 14. **设计模式**:可能包含单例...
SearchDemo可能使用了锁或者其他同步机制(如Java的`synchronized`关键字或C#的`lock`语句)来确保线程安全。 4. **回调或事件驱动**:当一个线程找到匹配的文件时,可能通过回调函数或者事件通知主程序或其他线程...
19. wait() 方法:wait() 方法是 Object 类的方法,调用者需持有同步锁,调用后线程进入等待状态,并释放锁。notify() 或 notifyAll() 可唤醒等待的线程。 20. OSI 模型:OSI 参考模型分为七层,分别是物理层、数据...
6. **同步与等待队列**:在多线程环境中,同步机制如信号量、互斥锁、条件变量等,以及等待队列头的使用,能防止数据竞争,保证驱动的正确运行。 7. **设备树**:在嵌入式系统中,设备树是配置硬件的手段,驱动程序...
在这个例子中,首先通过`snprintf`构造了一个路径字符串,然后尝试打开该路径对应的文件,并准备对其进行锁定。接下来应该会使用`fcntl`或`flock`函数对该文件进行锁定。 #### 知识点五:文件锁的应用场景 - **...
2. **互斥锁**:在 Java 中,`synchronized` 关键字用于为对象或方法加互斥锁,确保同一时间只有一个线程能访问被同步的代码块,从而保证线程安全。 3. **线程状态**:当一个 `synchronized` 方法终止时,线程执行...
- `StringBuffer`:线程安全的字符串操作类,适用于多线程环境下的字符串拼接。 - `LinkedList`:非线程安全的链表实现。 - `ConcurrentLinkedQueue`:线程安全的无界并发队列。 了解这些锁和线程安全的数据结构,...
当 key 存在但不是字符串类型时,返回一个错误。返回值:返回给定 key 的旧值。当 key 没有旧值时,也即是, key 不存在时,返回 nil 。 3)get语法:GET key返回值:当 key 不存在时,返回 nil 。 jedisLock—...
2. **线程同步与互斥**:`synchronized` 关键字用于为对象加互斥锁,确保同一时间只有一个线程能访问特定的代码块或方法,以保证线程安全。 3. **线程状态**:当一个`Thread`对象的`run()`方法终止时,线程会进入...
在这个例子中,尽管我们调用了`concat`方法来“修改”字符串`s1`,实际上我们得到的是一个新的`String`对象,原字符串`s1`的内容并没有改变,而是引用了新的字符串对象。 ### 知识点五:常见的Java面试题解析大全 ...
在字符串和文本处理上,`strings`包提供了常见字符串操作,如查找、替换、分割等;`unicode`和`utf8`包则负责Unicode字符集的支持和UTF-8编码处理。此外,`time`包提供时间相关的功能,包括日期时间格式化、定时器和...