Synchronized(this)
锁住该代码块的对象,等访问该对象的线程执行完,其他线程才可以执行。
Synchronized(xxx.class)
锁住该类,所有访问该类的线程,一次只有一个可以执行。
其他
A. 无论synchronized关键字加在方法上还是对象上,如果它作用的对象是非静态的,则它取得的锁是对象;如果synchronized作用的对象是一个静态方法或一个类,则它取得的锁是对类,该类所有的对象同一把锁。
B. 每个对象只有一个锁(lock)与之相关联,谁拿到这个锁谁就可以运行它所控制的那段代码。
C. 实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制
package kafka.producer
//kafka默认的分区 进行msg的keyhash分区
import kafka.utils._
import org.apache.kafka.common.utils.Utils
@deprecated("This class has been deprecated and will be removed in a future release. " +
"It has been replaced by org.apache.kafka.clients.producer.internals.DefaultPartitioner.", "0.10.0.0")
class DefaultPartitioner(props: VerifiableProperties = null) extends Partitioner {
private val random = new java.util.Random
def partition(key: Any, numPartitions: Int): Int = {
Utils.abs(key.hashCode) % numPartitions
}
}
kafka的自定义分区
import kafka.producer.Partitioner;
import kafka.utils.VerifiableProperties;
public class KafkaPartitioner implements Partitioner{
public KafkaPartitioner(VerifiableProperties properties) {
}
@Override
public int partition(Object obj, int numPartitions) {
int partition = 0;
if (obj instanceof String) {
String key=(String)obj;
int offset = key.lastIndexOf('.');
if (offset > 0) {
partition = Integer.parseInt(key.substring(offset + 1)) % numPartitions;
}
}else{
partition = obj.toString().length() % numPartitions;
}
return partition;
}
}