在下面的两个同步策略中,哪一个被优化(如在处理和生成的字节代码中)以及应该使用其中一个的场景.
public synchronized void addName(String name)
{
lastName = name;
nameCount++;
nameList.add(name);
}
Run Code Online (Sandbox Code Playgroud)
要么
public void addName(String name) {
synchronized(this) {
lastName = name;
nameCount++;
nameList.add(name);
}
}
Run Code Online (Sandbox Code Playgroud)
还有什么是处理并发的可行方法:
java.util.concurrent包Job或UIJobAPI(如果在eclipse PDE环境中工作)谢谢
有什么区别
public synchronized void addition()
{
//something;
}
Run Code Online (Sandbox Code Playgroud)
和
public void addtion()
{
synchronized (//something)
{
//something;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我错了,请忽略这个问题.
如果有人能够帮助我找到方法同步和对象同步之间的不同之处的真实例子,那就太好了.
方法同步示例
public class MyClassExample {
private int i;
public synchronized void increment(){
i = i + 1;
}
}
Run Code Online (Sandbox Code Playgroud)
对象同步示例
public class MyClassExample {
private int i;
Object writeLock = new Object();
public void increment(){
synchronized(writeLock) {
i = i + 1;
}
}
}
Run Code Online (Sandbox Code Playgroud) 这两个代码块会表现得一样吗?您可以假设从线程调用这些运行方法.
public synchronized void run() {
System.out.println("A thread is running.");
}
Run Code Online (Sandbox Code Playgroud)
要么
static Object syncObject = new Object();
public void run() {
synchronized(syncObject) {
System.out.println("A thread is running.");
}
}
Run Code Online (Sandbox Code Playgroud) 以下是什么可以理解?
我在SO上经历过这篇文章,但仍然无法组装它.
代码1:
synchronized(this){
// some code
}
Run Code Online (Sandbox Code Playgroud)
码2:
Object lock = new Object();
synchronized(lock){
// some code
}
Run Code Online (Sandbox Code Playgroud)
任何教程,或一些解释同步的链接,就像他们向孩子解释一样?
问题可能看起来很明显,但无论如何我都不清楚.
我有以下课程:
public class MyClass{
private Object lock = new Object();
private boolean flag;
public void method(){
//Start synchronization block
if(!flag){
flag = true;
//end synchronization block
//do some bulk operation, should be synchronized
}
//some other staff
}
}
Run Code Online (Sandbox Code Playgroud)
问题是我不能把我需要同步的代码片段,因为它不正确.怎么做这样的同步?也许有一些java.util.concurrent我可以利用的东西.
我有一个多线程程序,我想知道使用"synchronized"的方式是正确的.
方式1:我有一个类对象(将被传递给多个线程),在其中称为MyClass:
public synchronized void set(String name) {
this.name = name;
}
Run Code Online (Sandbox Code Playgroud)
方式2:我有相同的类,但没有在其set方法中"同步":
public void set(String name) {
this.name = name;
}
Run Code Online (Sandbox Code Playgroud)
调用者将执行此操作:
MyClass myclass = new MyClass();
synchronized(myclass) {
myclass.set("myclass");
}
Run Code Online (Sandbox Code Playgroud)
谁能告诉我哪一个是实现多线程对象共享的正确方法?我很困惑这两个,我试过两个,他们似乎工作正常.
可能重复:
同步块与同步方法?
从对这个问题的公认答案:在Java关键部分中,应该同步什么? 我了解到
public synchronized void foo() {
// do something thread-safe
}
Run Code Online (Sandbox Code Playgroud)
和:
public void foo() {
synchronized (this) {
// do something thread-safe
}
}
Run Code Online (Sandbox Code Playgroud)
做完全一样的事情。但是在第一种情况下,我们仅使对象的一种方法同步,而在第二种情况下,使不可访问的Whole对象。那么,为什么这两个代码片段执行相同的操作?
下面的锁定和并发方法有什么区别?
public synchronized ArrayList<Player> getPlayers() {
return players;
}
public ArrayList<Player> getPlayers() {
synchronized(players) {
return players;
}
}
public ArrayList<Player> getPlayers() {
synchronized(GameHandler.class) {
return players;
}
}
Run Code Online (Sandbox Code Playgroud)
我们如何决定在哪种情况下应该使用哪一个?
编辑:
我已经编辑了我的帖子标题和帖子以证明这不是重复.谢谢.